** 首先份上一份比较详细的java虚拟机的思维导图:** https://www.processon.com/view/5eafee726376897466a3a821#map
什么是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)、掘金,转载请注明出处。