注:可达性分析法(
判断对象是否存活
):当一个对象到GC Roots没有任何引用链相连时。
GC Roots对象:虚拟机栈中对象引用;本地方法栈中对象引用;方法区中静态变量引用;方法区中常量的引用;
1,Minor GC(Young GC)
1)Minro GC触发条件与GC算法
当Eden空间不足时,会触发Minor GC。
使用Copying复制算法,当存活对象少时,复制算法效率很高。
2)查看minor gc过程jstat -gc 60 1000
3)jstat结果说明
S0C、S1C、S0U、S1U
:s0和s1的容量和使用量
EC、EU
:年轻代容量和使用量
OC、OU
:年老代的容量和使用量
MC、MU
:元空间的容量和使用量
CCSC、CCSU
:压缩空间的容量和使用量
YGC、YGCT
:年轻代gc次数和gc耗时
FGC、FGCT
:full gc次数和耗时
GCT
:gc总耗时
2,Major GC(Full GC)
1)新生代对象晋升到年老代的时机
Eden满:此时使用S0作为from进行minor gc时,S1无法容纳ygc后的对象,则通过分配担保机制提前进入年老代。
-XX:PretenureSizeThreshold:对象大小超过设置的值,则直接分配在old区。默认为0,全部在eden分配。对ParNew和Serial收集器生效。
-XX:MaxTenuringThreshold:对象age计数器达到阈值时,晋升到年老代。
动态年龄判定:相同年龄(age)对象的sum(size)超过S区的一半,大于age的对象直接进入年老代。
2)触发Full GC的条件
System.gc():建议JVM进行full gc,通常使用-XX:+DisableExplicitGC来禁用。
老年带空间不足:新生代对象转入过快、创建大对象、大数组时。
永久带空间不足:未使用cms收集器时,会执行full gc。
3)年老代GC算法
标记-清除:标记出待回收对象 -> 统一回收被标记对象 -> 会产生碎片。如CMS垃圾回收器。
标记-整理:标记出待回收对象 ->存活对象向一端移动 -> 清除边界以外的内存 -> 耗时,无碎片。如parallel old 垃圾回收器。G1垃圾回收器。
2,CMS GC
1)CMS
Concurrent Mark Sweep(多线程并发标记-清理)
:CMS号称是停顿时间最短的GC,-XX:+UseConcMarkSweepGC启用。它使用标记-清除算法,会产生碎片,但是速度快。
2)CMS步骤
初始标记:STW单线程执行,标记gc roots可达的对象。
并发标记:与用户线程一起执行,遍历InitialMarking标记存活对象,递归标记。
重新标记:STW并发重新标记。
并发清理:与用户线程一起执行,清理标记的垃圾对象。
并发重置:初始化CMS结构和数据。
3)CMS相关参数
-XX:CMSInitiatingOccupancyFraction:默认68%,当old使用了达到68%时触发cms gc。(可以调整为80%)
-XX:ParallelCMSThreads:设置CMS线程数量。
-XX:+UseCMSCompactAtFullCollection:CMS收集完成时,进行一步内存整理。
3,G1收集器
1)
基于标记-压缩算法,不会产生空间碎片。可以指定停顿时长为M时,垃圾回收时间不超过N。
区域化、分代式垃圾回收器,堆被划分成若干个(不超过2048)大小相同的区域。
G1将一组或多组区域,增量、并行的方式复制到不同的区域实现压缩,减少堆碎片。
2)G1回收过程
3)G1相关参数
-XX:+UseG1GC:告诉JVM使用G1回收器。
-XX:MaxGCPauseMillis:GC目标最大停顿时间。
-XX:G1HeapRegionSize:[1, 32M] 设置region大小。
4)G1优势
转载于:https://www.jianshu.com/p/b72e4f9b2cea