本文主要是介绍Java常用垃圾收集器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
垃圾收集器
Serial
- 单线程,使用复制算法
- 用于新生代的垃圾回收
- 进行GC时必须暂停所有其他工作线程
- 适用于内存不太大的桌面应用
Serial Old
- Serial的老年代版本
- 单线程,使用标记-整理算法
ParNew
- Serial的多线程版本,可与CMS配合使用
- 用于新生代的垃圾回收
- CPU数量多的时候才能发挥优势,适用于Server上的应用
Parallel Scavenge
- 目标上达到一个可控的吞吐量,降低GC时间的占比
- 不能和CMS配合使用
- 适用于后台运算而不需要太多交互的任务
- 可使用-XX:+UseAdaptiveSizePolicy开启自适应调节策略,由虚拟机来调节各个相关参数的值
Parallel Old
- Parallel Scavenge的老年代版本
- 多线程,使用标记-整理算法
- 适用于在吞吐量优先的场合和Parallel Scavenge配合使用
CMS
- 全称:Concurrent Mark Sweep
- 以获取最短回收停顿时间为目标
- 适用于重视响应速度,用户交互比较多的应用
- 用于老年代的GC,使用标记-清除算法
- GC分为4个步骤:初始标记,并发标记,重新标记,并发清除
- 初始标记和重新标记需要Stop The World,并发标记和并发清除可以和用户线程并发执行
- 并发标记和并发清除占用了cpu资源,会导致用户线程的执行速度变慢
- 在进行GC时用户线程会产生新的垃圾(浮动垃圾),这些垃圾只能在下一次GC时清理,所以不能等到老年代快满了才进行GC,参数-XX:CMSInitiatingOccupancyFraction用于设置触发GC的百分比,在jdk 1.6中,这个值时92%
- 标记-清除算法会产生大量内存碎片,但无法找到足够大的连续空间分配给对象时会提前出发一次Full GC
G1
- 适用于服务端应用
这篇关于Java常用垃圾收集器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!