乐趣区

关于java:初步了解jvmjvm简介和简单调优

首先份上一份比拟具体的 java 虚拟机的思维导图: https://www.processon.com/vie…

什么是 jvm:

简述就是 : JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,java 虚拟机实质上就是一个程序,当它在命令行上启动的时候,就开始执行保留在某字节码文件中的指令。通过 jvm 虚拟机能够实现跨平台运作。

  • 如图能够晓得 jdk = java-tool + jre,而 jre 蕴含了 jvm*

如图能够看出 jvm 在不同的操作系统能够生成不同 的机器码,这样就实现了跨平台应用。

jvm 底层残缺的运行示意图:

栈:又叫线程站

栈内存 寄存 程序运行的局部变量 =》如动态变量

每个线程运行 jvm 都会在栈内存开拓一个空间

个性:先进后出【FILO】

栈帧:JVM 执行 Java 程序时须要装载各种数据到内存中,不同的数据寄存在不同的内存区中(逻辑上)

通过 javap 命令将 Math.class(就是下面的 java 代码的类) 反编译一下,前面造成的就是如下图所示的指令码

ps: 办法进口就是 a 调用 b 的办法时“口子 / 地位”就是 b 办法的进口

堆:

这个局部变量是对象类型(new 进去的),而后会将这个对象的指针【内存地址】寄存到堆外面。

堆的内部结构:

个别 new 进去的对象放在 Eden 区。【一旦 Eden 区放满了 =》 会触发 minor GC 1. 非垃圾对象就把它放进 From 区 同时 jvm 会分代年龄加一 2. 把‘’垃圾‘’对象清理掉】

什么是垃圾对象 :1. 没有指针的对象 2. 可达性剖析算法

当老年代都放满了,就会触发 Full GC。

jvm 垃圾收集机制 简略解说

下图是一个多线程程序 始终 new 对象 往【堆】内存外面放

上面是 jvm 的动静:

STW:Java 中一种全局暂停景象,全局进展,所有 Java 代码进行,native 代码能够执行,但不能与 JVM 交互。会让应用程序临时进行。

JVM 调优的重点就是缩小 STW 的次数,因为大并发的状况下 STW 的影响是很大的,用户体验极度不好。

亿级电商流量的线上调优

个别亿级电商网站都是微服务架构,如图:

推算网站大促每秒订单数和机器分配资源 到耗费内存




推算一个订单对象的大小 :一个对象一个 1024 个字节【1kb】(ps:Int 对象 4 个,string 占用最大字节 = 长度 *2)

ps: 在 eden 区能存活一次的对象,会被放入 Survivor 区

一个对象是挪动到老年代 而不是年老代 [Survivor 区],判断规范:
1. 对象存活工夫比拟长【通过 15 次的 MInor GC】
2. 对象占用内存 Survivor 区的一半内存【依据理论硬盘调配设置】,就会间接调配到老年代

如图中的对象 jvm 参数设置的
13 秒后就会让 eden 区占满,
Survivor 区占 100M 内存,每次都会被调配到老年代,当 5 - 6 分钟后老年代占满了 触发 Full GC , 从而呈现利用卡顿 / 暂停的景象,这是咱们不违心见到的。所以须要 jvm 调优。

这样 25 秒左右能力占满 Eden 区,而后 60M 的对象也能放入 survivor 区(没超过其中一半),当 survivor 区放满是 会触发 Minor Gc 能够把之前的垃圾对象进行回收,个别状况下 就不会有什么对象进入老年代,不会触发 Full GC

本文来源于:宋文超 super,专属平台有 csdn、思否 (SegmentFault)、简书、开源中国 (oschina)、掘金,转载请注明出处。

退出移动版