4-垃圾收集器
2021-04-17 18:24:28 0 举报
AI智能生成
垃圾收集器
作者其他创作
大纲/内容
垃圾收集算法
1、标记-复制算法:内存空间划分为两半,当一块内存空间用完;就将存活的对象复制到另一半。
2、标记-清除算法:先标记、后清除。
缺点:
缺点:
- 效率问题 (如果需要标记的对象太多,效率不高)
- 空间问题(标记清除后会产生大量不连续的碎片)
3、标记-整理算法:先标记,存活对象移到一端,在清理。
垃圾收集器
1、串行:Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC)
2、并行:Parallel Scavenge收集器(-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代))
- JDK1.8默认
- Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)
- 应用于复杂的科学计算、例如:结算、报表
3、CMS(4~8G内存)
- CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。(用户体验)
- 搭配:ParNew使用
- 优缺点
优点:并发收集、停顿低
缺点
1、抢占CPU资源
2、无法处理浮动垃圾,只能等下次GC处理。 (三色标记中的,白色标记)
3、使用了标记-清除算法,会造成大量空间碎片
- -XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片)
- -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一 次
4、并发失败(concurrent mode failure)、前一次没执行完,又执行。
出现后使用,serial old垃圾收集器来回收,效率低下
解决策略
- -XX:CMSInitiatingOccupancyFraction: 当老年代使用达到该比例时会触发FullGC(默认是92,这是百分比)
- -XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设 定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整
- -XX:+CMSScavengeBeforeRemark:在CMS GC前启动一次minor gc,目的在于减少老年代对年轻代的引 用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时 80%都在标记阶段
- 其他设置参数
-XX:+CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW
-XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW
- 三色标记
- 记忆集与卡表:解决跨代引用问题
4、G1(8G以上)
- 组成
- 过程
- 停顿时间(核心),默认200ms:
筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期 望的GC停顿时间(可以用JVM参数 -XX:MaxGCPauseMillis指定)来制定回收计划
- 垃圾收集分类
1、YoungGC:根据停顿时间触发,当计算出回收时间接近停顿时间,既触发。
2、MixedGC(非Full GC):老年代的堆占有率达到参数(-XX:InitiatingHeapOccupancyPercent)设定的值则触发,回收所有的 Young和部分Old(根据期望的GC停顿时间确定old区垃圾收集的优先顺序)以及大对象区
3、Full GC:停止系统程序,然后采用单线程进行标记、清理和压缩整理,好空闲出来一批Region来供下一次MixedGC使用,这 个过程是非常耗时的。(Shenandoah优化成多线程收集了)
- 常见参数:
1、-XX:InitiatingHeapOccupancyPercent:老年代占用空间达到整堆内存阈值(默认45%),则执行新生代和老年代的混合 收集(MixedGC),
2、-XX:G1MixedGCLiveThresholdPercent(默认85%) region中的存活对象低于这个值时才会回收该region,如果超过这 个值,存活对象过多,回收的的意义不大。
3、-XX:G1MixedGCCountTarget:在一次回收过程中指定做几次筛选回收(默认8次),在最后一个筛选回收阶段可以回收一 会,然后暂停回收,恢复系统运行,一会再开始回收,这样可以让系统不至于单次停顿时间过长。
- 使用场景(例:Kafka)
1. 50%以上的堆被存活对象占用
2. 对象分配和晋升的速度变化非常大
3. 垃圾回收时间特别长,超过1秒
4. 8GB以上的堆内存(建议值)
5. 停顿时间是500ms以内
2. 对象分配和晋升的速度变化非常大
3. 垃圾回收时间特别长,超过1秒
4. 8GB以上的堆内存(建议值)
5. 停顿时间是500ms以内
5、ZGC
可回收堆内存T级别
0 条评论
下一页