垃圾回收器比较
名称 | 是否多线程 | 新生代是否停顿 | 老年代是否停顿 | 是否对老年代压缩整理 | 备注 |
---|---|---|---|---|---|
Serial | 单线程 | 是 | 是 | Full GC时整理 | 常用于单CPU可用的机器上 |
Throughput(Parallel) | 多线程 | 是 | 是 | Full GC时整理 | server上默认收集器 |
CMS | 多线程 | 是 | 否 | 后台线程不整理,无连续空间时暂停所有线程,使用单线程整理 | 占用CPU多,能减少Full GC |
G1 | 多线程 | 是 | 大多数不需要暂停 | 老年代不大容易发生碎片化 | 比CMS更不容易Full GC |
适用场景
Parallel和CMS比较:Parallel在并发上有优势,而CMS在响应时间上有优势。
CMS和G1比较:一般情况下,堆空间小于4G时,CMS比G1性能好;在大堆或者超大堆上GG1有优势。
调优准则
Parallel调优准则:降低GC时间百分比,GC时间百分比和堆大小关系找到一个平衡点。可以使用-XX:GCTimeRatio命令让虚拟机自行调整堆大小,以达到设置的GC时间百分比。
并发失效:由于CMS不能够以足够快的速度清理老年代:新生代需要进行垃圾回收时,CMS收集器发现老年代没有足够大小的空间容纳晋升的对象,不得不对老年代进行垃圾回收。
晋升失效:老年代有足够的空间容纳晋升对象,但是由于空间碎片化,没有连续的空间容纳晋升对象,导致晋升失败。
CMS调优准则:避免并发失效;
避免并发失效方法:
- 增大老年代空间。
- 提高后台回收线程的效率(或者使用更多的线程)。
提高后台线程效率的方法:
- 给后台线程更多运行的机会:使用
-XXCMSInitiatingOccupancyFraction=N
-XX:+UseCMSInitialingOccupancyOnly
让后台线程在老年代空间被使用N%时就触发垃圾回收。
- 使用
-XX:ConGCThreads=N
调整后台线程数量