垃圾收集器(垃圾收集算法的实现)
Posted Carl_Hugo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了垃圾收集器(垃圾收集算法的实现)相关的知识,希望对你有一定的参考价值。
Serial收集器
单线程垃圾收集器,在其进行垃圾收集的时候需要暂停其他的线程。
Serial收集器是Client模式下的默认新生代垃圾收集器。
ParNew收集器
Serial收集器的多线程版本,是Server模式下默认新生代垃圾收集器。
Parallel Scavenge收集器
新生代垃圾收集器 ,使用的算法是复制算法,也是并行多线程收集器。和ParNew的区别是,ParallelScavenge收集器更关注可控制的吞吐量。(吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集时间))
Parallel Scavenge 收集器使用两个参数控制吞吐量:
-XX:MaxGCPauseMillis 控制最大的垃圾收集停顿时间,
-XX:GCRatio 直接设置吞吐量的大小。
Serial Old收集器
是Serial收集器的老年代版本,也是个单线程收集器,采用“标记-整理算法”进行回收。
Parallel Old收集器
是 Parallel Scavenge 收集器的老年代版本,使用多线程和“标记-整理算法”进行垃圾回收。通常与Parallel Scavenge配合使用。
CMS(Concurrent Mark Sweep)
标记清除法,对老年代进行回收。
CMS过程
1.初始标记:这个阶段需要虚拟机停顿正在执行的任务,从垃圾回收的根对象开始,只扫描能够和根对象直接关联的对象并做标记。
2.并发标记:在初始标记的基础上继续向下追溯标记,并发标记阶段,应用程序的线程和并发标记的线程并发执行。
3.并发预清理:并发预清理阶段仍然是并发的,在这个阶段虚拟机查找在执行并发标记阶段新进入老年代的对象。通过重新扫描减少下一个阶段“重新标记”的工作。
4.重新标记:这个阶段会暂停虚拟机,收集器线程扫描在CMS中剩余的对象,扫描从根对象开始向下追溯,并处理对象关联。
5.并发清理:清理垃圾对象,这个阶段收集器线程和应用程序线程并发执行。
6.并发重置:这个阶段,重置CMS收集器的数据结构,等待下一次垃圾回收。
CMS缺陷:
标记清除法会产生空间碎片。
线程和应用程序线程并行执行,这样会需要更多的CPU。
CMS在回收完堆空间之前还有空间分配给正在运行的应用程序,必须预留一部分空间。也就是说CMS不会在老年代满的时候才开始收集,默认当老年代使用68%的时候,CMS就开始行动了。
总的来说CMS回收器减少了回收的停顿时间,降低了堆空间的利用率。
CMS使用场景
对应用程序停顿敏感,但能够提供较大内存和更多CPU的场景。
G1(Garbage First)
G1长期目标是取代CMS,G1比CMS改进的地方:
1. G1是压缩型收集器,G1通过有效的压缩避免了对于细微空闲内存空间的分配,消除了空间碎片的问题。
2. G1的垃圾收集停顿比CMS容易估计,允许用户自定义停顿参数。
上一代垃圾收集器将堆内存划分为固定大小的三个部分,年轻代、老年代和持久代。
G1收集器将内存划分为多个大小相等的heap区。G1中各代的heap区不像老一代垃圾收集器一样要求各部分是连续的。
G1年轻代收集
- 将堆一整块内存空间分为多个heap区(regions)。此外,还有第四种类型,被称为巨型区域(Humongous Region)Humongous 区域是为了那些存储超过 50% 标准 region 大小的对象而设计。
- 年轻代内存由一组不连续的regions区组成,方便容量调整。
- 年轻代的垃圾收集会有stop the world事件。
- 年轻代GC通过多线程并行执行。
- 存活的对象被拷贝到新的survivor区或者老年代。
G1老年代收集
并发标记清理阶段
1.1 活跃度信息在程序运行的时候被并行计算出来
1.2 活跃度信息标致出哪些区域在转移暂停期间最适合回收
1.2 不像CMS有清理阶段再次标价阶段
2.1 使用Snapshot-at-the-Beginning算法比CMS所用的算法要快的多
2.2 完全空的区域直接被回收拷贝/清理阶段
3.1 年轻代和老年代同时进行回收
3.2老年代的选择基于其活跃度
以上是关于垃圾收集器(垃圾收集算法的实现)的主要内容,如果未能解决你的问题,请参考以下文章