3.新老年代GC和CMS
2020-12-14 15:39:33 6 举报
新老年代GC和CMS
作者其他创作
大纲/内容
-XX:InitialHeapSize:堆内存大小-XX:MaxHeapSize:堆内存最大大小-XX:NewSize:堆中新生代大小-XX:MaxNewSize:堆内存中新生代最大大小-Xss:每个线程的栈内存大小-XX:MetaspaceSize:元空间大小-XX:MaxMetaspaceSize:元空间最大大小
新生代对象进入老年代
满了
Eden满了,执行YGC之前
JVM参数调优:
metaspace/永久代(常量池、类信息、static变量)
动态年龄判断:在存放对象的S区,一批对象总大小大于了这块S区内存大小的50%,那么此时大于等于这批对象年龄的对象,可以直接进入老年代
老年代空间分配担保规则
重新标记
与用户线程并发交替运行,系统会创建新的存活对象,也可能让部分存活对象失去引用变成垃圾对象。在这个过程中,垃圾回收线程,尽可能的对已有的对象进行GC Root追踪
1.检查老年代连续空间是否大于新生代所有对象空间2.如果大于,执行YGC,此次YGC是安全的,即使YGC后所有对象都存活,Survivor区放不下,也可转移到老年代3.如果小于,则继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象平均大小4.如果大于,尝试进行一次YGC,这次YGC伴随风险: 4.1.YGC过后,剩余存活对象大小,小于S区大小,则存活对象进入S区 4.2.YGC过后,剩余存活对象大小,大于S区,但小于老年代可用内存大小,直接进入老年代 4.3.YGC过后,剩余存活对象大小,大于S区并大于老年代可用内存大小,则触发一次FGC
会STW,影响不大,速度很快,仅标记GC Roots直接引用的对象
新生代
再次进入STW,重新标记下在第二阶段里新创建的一些对象,还有一些已有对象可能失去引用变成垃圾的情况
并发清理
新生代对象经历垃圾回收15次后,会进入老年代。该阈值通过JVM参数:【-XX:MaxTenuringThreshold】来设置,默认15
Full GC
CMS(标记清理算法)
-XX:+UseCMSCompactAtFullCollection:碎片整理-XX:CMSFullGCsBeforeCompaction:多少次Full GC之后执行碎片整理-XX:+PrintGCDetils:打印详细的qc日志-XX:+ PrintGCTimeStamps:这个参数可以打印出来每次GC发生的时间-Xloggc:gc.log:这个参数可以设置将gc日志写入一个磁盘文件
-XX:PretenureSizeThreshold:大对象國值-XX:MaxTenuringThreshold:多少岁进入老年代-XX:+UseParNewGC:指定年轻代用ParNew回收器-XX:+UseConcMarkSweepGC:指定老年代用CMS回收器
1.触发老年代空间分配担保,触发FGC条件看左侧2.执行YGC之后,有对象需要放入老年代,老年代没有足够内存空间时,立即触发一次FGC3.老年代内存使用率超过92%,直接触发FGC,可通过参数:【-XX:CMSInitiatingOccupancyFaction】配置
触发Full GC的条件
老年代
ParNew回收器(多线程复制算法)
YGC
大对象直接进入老年代,通过JVM参数:【-XX:PretenureSizeThreshold】来设置
并发标记
耗时,清除没有标记的对象并且回收空间,并发执行,不影响系统程序运行
初始标记
0 条评论
下一页