> 文章列表 > Java性能优化-垃圾回收算法-理解CMS回收器

Java性能优化-垃圾回收算法-理解CMS回收器

Java性能优化-垃圾回收算法-理解CMS回收器

垃圾回收算法

理解 CMS回收器

三个基本操作
1.回收新生代(同时暂停所有的应用线程
2.运行并发周期来清理老年代数据
3.如果有必要则FULL GC压缩老年代
当发生新生代回收 ,
如果老年代没有足够的空间容纳晋升的对象则执行FULL GC,所有线程停止开始清理老年代中的垃圾对象
晋升失败的原因还有可能是内存存在碎片化而导致失败
FULL GC 在JDK8中不是并发
当元空间被填满并需要回收,CMS不会回收元空间,如果填满了需要full gc来处理未被任何引用的类
默认情况下CMS不会回收元空间

针对并发模式失败的优化

优化CMS目的是确保不会发生并发 模式失败或者晋升失败
并发模式失败是因为CMS清理老年代的速度不顾快,并发清理G1
执行新生代回收,CMS计算出没有足够的空间容纳晋升对象,所以先回收老年代
避免并发模式失败:G1从这些现象中发现了优化的方式
1.让老年代空间大一点

2.更频繁的运行后台线程清理
-XX:CMSInitiatingOccupancyFraction=N 默认70%
-XX:+UseCMSInitiatingOccupancyOnly 默认false
并发处理周期会在老年代的70%开始处理

3.使用更多的后台线程
增加后台线程公式
ConcGCThreads = (3 + ParallelGCThreads) / 4

tips:

避免并发模式失败是实现CMS最佳性能的关键
避免失败的最简单的方法也是最复杂的计算方法是增加堆的大小
调整提前启动并发后台线程和增加后台线程数量