一、串行垃圾回收器
单线程进行垃圾回收,只有一个线程工作,并且java中的工作线程要暂停,等待垃圾回收完成;
二、并行垃圾回收器
在串行垃圾回收器的基础上增加了多线程,这样就可以缩短垃圾回收时间,但是进行垃圾回收时,工作线程也要暂停;
三、parauelGC垃圾回收器
在并行垃圾回收器的基础上,新增了两个和系统吞吐量相关的参数,使其更加灵活高效;
四、CMS垃圾回收器
多线程执行,使用标记清除算法(自动清理碎片),主要针对老年代,进行垃圾回收时,工作线程可以继续执行;
工作步骤:
- 初识标记
- 并发标记
- 预处理
- 重新标记
- 并发清理
- 重置
五、G1垃圾回收器
JDK1.7正式使用,orcle计划在1.9中设为默认的垃圾回收器,代替CMS,G1的设计原则:简化JVM的性能调优;
原理:取消了年青代和年老代的物理上的划分,而是把堆内存分为若干个区域,这些区域包含了逻辑上的年轻代和年老代,短期的巨大的对象不会被直接存储到老年区,而是被放到一个特殊的H区;
优点:不用单独对每个代设置,不用担心每个代内存是否够用,解决了碎片化问题,
G1垃圾回收器的三种模式(不同的条件下,触发不同模式):
- YongGC,在eden空间耗尽时会被触发,eden空间的数据移动到survivor中,如survivor空间不够,eden中部分数据会晋升到老年代;survivor区中的数据移动到新的survivor区中,也有部分晋升到老年代,;最终eden空间的数据为空,G1停止工作,应用线程继续工作;YongGC为了更快的找到年轻代中的根对象,G1引进了Rset的概念,作用是跟踪指向某个堆内的对象引用,
- MixedGC,当老年代大小占整个堆大小百分比达到该阈值时触发(默认45%);
- FullGC