通过Java命令执行代码的大体流程
类加载器的双亲委派机制
JVM内存模型
JVM通用参数设置
对象创建的主要流程
分配内存之划分内存
1.指针碰撞
2.空闲列表
分配内存之并发问题解决方法
1.CAS
2.本地线程分配缓冲(TLAB)
对象头组成部分
1.标记字段
2.Klass类型执行
3.数组长度
指针压缩
1.33位到35位的内存地址在存储时会进行压缩成32位进行存储,节省内存空间
2.堆内存小于4G时不需要启用指针压缩
3.堆内存大于32G时压缩指针会失效
对象内存分配流程图
老年代空间分配担保机制
JVM垃圾收集
垃圾收集算法
分代收集理论
标记复制算法
标记整理算法
标记清除算法
垃圾收集器
串行收集器
单垃圾收集线程
-XX:+UseSerialGC -XX:+UseSerialOldGC
新生代:标记复制 老年代:标记整理
并行收集器
多垃圾收集线程
-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代) JDK1.8默认使用
新生代:标记复制 老年代:标记整理
ParNew收集器
可以与CMS配合使用的并行收集器
-XX:+UseParNewGC
新生代:标记复制
CMS收集器
垃圾收集线程与用户线程同时工作
-XX:+UseConcMarkSweepGC
老年代:标记清除
过程:初始标记-》并发标记-》重新标记-》并发清理-》并发重置
CMS参数
并发标记之 三色标记
对于读写屏障,以Java HotSpot VM为例,其并发标记时对漏标的处理方案如下:
CMS:写屏障 + 增量更新
G1,Shenandoah:写屏障 + SATB
ZGC:读屏障
跨代引用之记忆集与卡表
G1收集器
多垃圾收集线程
-XX:+UseG1GC JDK1.9默认使用G1
新老代都使用它,整体是基于标记整理 局部是基于标记复制;
可预测的停顿时间模型
分区Region: Eden,Survivor,Old,Humongous,
分代概念是逻辑概念,而非物理概念
过程:初始标记-》并发标记-》最终标记-》筛选回收(STW)
筛选回收时根据优先列表及回收价值进行垃圾回收;
G1参数设置
G1使用场景
ZGC收集器
不分代(暂时)
ZGC的Region分为三类:小型S(2M),中型M(32M),大型L(容量不固定,必须是2M的整数倍,存放4MB及以上单个大对象)
NUMA:给CPU分配有限内存
颜色指针:ZGC将GC信息保存在指针中;
过程:
1并发标记(初始标记-》并发标记-》最终标记)
2并发预备重分配
3并发重分配
4并发重映射(下次GC的1并发标记中去完成)
ZGC触发时机
ZGC目前有4种机制触发GC:
1.定时触发,默认为不使用,可通过ZCollectionInterval参数配置。
2.预热触发,最多三次,在堆内存达到10%、20%、30%时触发,主要时统计GC时间,为其他GC机制使用。
3.分配速率,基于正态分布统计,计算内存99.9%可能的最大分配速率,以及此速率下内存将要耗尽的时间点,在耗尽之前触发GC(耗尽时间 - 一次GC最大持续时间 - 一次GC检测周期时间)。
4.主动触发,(默认开启,可通过ZProactive参数配置) 距上次GC堆内存增长10%,或超过5分钟时,对比距上次GC的间隔时间跟(49 * 一次GC的最大持续时间),超过则触发