04.垃圾收集器
2020-12-23 18:29:17 0 举报
JVM垃圾收集器深度解析
作者其他创作
大纲/内容
应用线程与回收线程并发执行,寻找标记剩余非垃圾对象(速度慢)占整个过程的80%
年轻代
筛选回收
大对象的判定规则:对象超过一个Region大小的50%
Safe Point(安全点) :对正在执行的线程设定的。注:触发GC之前需要通知应用程序线程即将做GC操作,使其再特定的安全点保存线程运行的状态,所有线程准备好后开始GC。安全点位置主要有以下几种:1. 方法返回之前2. 调用某个方法之后3. 抛出异常的位置4. 循环的末尾
4.由于采用标记-清除算法,容易产生碎片垃圾,可设置整理碎片
(Concurrent Mark Sweep)是真正意义上的并发收集器,实现垃圾回收线程与应用程序线程一起工作,通过减少STW的时间而提高用户的体验
PerNew
碎片整理
G1收集器
ParNew收集器收集年轻代垃圾+CMS收集器收集老年代垃圾(Serial收集器)
最终标记(重新标记)
算法整体:标记-清除算法局部(回收):复制算法
垃圾收集器
STW,只标记GC Root根能直接引用的对象(速度快)
内存模型
-XX:G1NewSizePercent:设置新生代初始占比-XX:G1MaxNewSizePercent:新生代默认最大空间
执行流程
2.执行过程不确定性,可能当前GC未完成又开始新GC,此时直接STW,调用Serial收集器执行。
STW,标记上个并发标记阶段新产生的非垃圾对象(速度快)
Serial收集器
Safe Region(安全区域) :指在一段代码片段中,引用关系不会发生变化。在这个区域内的任意地方开始 GC 都是安全的注:安全点与安全区域是同步发生的。例如:如果一个线程处于 Sleep 或中断状态,它就不能响应 JVM 的中断请求,再运行到 Safe Point 上。因此 JVM 引入了 Safe Region。
算法新生代:复制算法老年代:标记-整理算法
类似于ParNew收集器,注重高吞吐量,是Server 模式(内存大于2G,2个cpu)下的默认收集器
Serial
Eden
-XX:+UseParallelGC:年轻代使用Parall收集器XX:+UseParallelOldGC:老年代使用Parall收集器
Parallel Scavenge收集器
初始标记
并发标记
并发重置
-XX:+UseParNewGC:年轻代使用ParNew收集器-XX:ParallelGCThreads:指定收集器的线程数
后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的Region
串行化单线程收集器
应用线程与回收线程同步执行,并发清理未标记的垃圾
Humongous
安全点(SafePoint)
ParNew收集器
ParallelOld
概念
默认堆内存占比5%,动态扩展,最多不超过60%(Eden:Survivor=8:1:1)
Old
1.对各个Region的回收价值和时长进行排序
启动应用线程
优点:并发收集、低停顿
CMS收集器执行流程
停止系统程序,然后采用单线程进行标记、清理和压缩整理,空闲出来一批Region来供下一次MixedGC使用,这个过程是非常耗时的
算法老年代:标记-清除算法
Serial Old
清理完后将之前所做的标记清除重置
并发清理
GC分类
(Garbage-First):是面向服务器的收集器,主要针对配备多颗处理器及内存量大的机器,以满足具备停顿时间的要求及高吞吐量的要求。
大对象内存
参数:-XX:+UseConcMarkSweepGC:启用cms-XX:ConcGCThreads:设置并发的线程数-XX:+UseCMSCompactAtFullCollection:标识完成FullGC后进行整理内存-XX:CMSFullGCsBeforeCompaction:标识每完成多少次FullGC后压缩整理内存-XX:CMSInitiatingOccupancyFraction:回收阈值,设置当老年代空间使用率达到多少时进行FullGC,默认92%-XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值,如果不指定,JVM仅在第一次使用设定值,后续则会自动调整-XX:+CMSScavengeBeforeRemark:在CMS GC前启动一次minor gc,目的在于减少老年代对年轻代的引用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时 80%都在remark阶段
大对象不再进入老年代,直接进入大对象内存存储
-XX:MaxGCPauseMillis指定停顿时间,默认200ms
Survivor
选择垃圾收集器
老年代所占的内存>整个堆内存的45%(默认)【-XX:InitiatingHeapOccupancyPercen】,采用复制算法,如果剩余Region不足以支持Mixed GC完成,则直接进行Full GC
CMS收集器
老年代
ParallelScavenge
G1
主要面向多核大内存的服务器,保证GC的停顿时间及高吞吐量。
将堆分为大小相同的Region区,最多为2048个;Region'的类型可能动态改变,比如由年轻代转为老年代
条件1:Eden区放满:条件2:接近或者达到所期望的GC停顿时间200ms(默认)【-XX:MaxGCPauseMills】,否则对Eden进行扩容,即增加Eden的Region数量。
多线程垃圾收集器,即Serial收集器的多线程版本
1.由于线程并发执行,对内存资源敏感,争夺内存资源
Full GC
-XX:+UseSerialGC :年轻代使用Serial收集器 -XX:+UseSerialOldGC:老年代使用Serial收集器
重新标记
1. 优先调整堆的大小让服务器自己来选择2. 如果内存小于100M,使用串行收集器3. 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择4. 如果允许停顿时间超过1秒,选择并行或者JVM自己选5. 如果响应时间最重要,并且不能超过1秒,使用并发收集器
2.根据用户所期望的停顿时间制定回收计划
CMS收集器优缺点
Mixed GC
扩展
设置参数:-XX:+UseCMSCompactAtFullCollection完成FullGC之后进行碎片整理
3.由于并发清理阶段,应用程序也在运行,这段时间新产生的垃圾对象(浮动垃圾)无法处理。
Young GC
CMS
0 条评论
下一页