JVM垃圾收集器
1 serial/serialOld
serial收集器:单线程 用于新生代 采用复制算法
serialOld收集器: 单线程 用于老年代 采用标记整理算法
在单cpu的环境中,serial收集器没有线程交互的开销,能获得最高的单线程收集效率。对运行的client模式下的虚拟机来说,是一个很好的选择。
2 ParNew收集器
parnew收集器是serial收集器的多线程版本,目前除了serial收集器,只有parnew收集器能与cms收集器配合工作。
新生代使用复制算法,老年代使用标记整理算法。
3 parallel scavenge 收集器
为了提高吞吐量而生,是一个新生代收集器,使用复制算法,适合在后台运算而不需要太多交互的任务。 吞吐量:运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
两个参数: MaxGCPauseMillis(最大停顿时间)和GCTimeRatio(吞吐量)
4 parallel old收集器
parallel old是 parallel scavenge收集器的老年代版本,使用多线程和标记整理算法。
5 CMS收集器
concurrent mark sweep 收集器以获取最短回收停顿时间为目标。使用标记-清除算法。
分为4个阶段:
1)初始标记:标记GC roots能直接关联到的对象。
2)并发标记:GC roots Tracing。
3)重新标记:修正并发标记期间用户程序导致的标记变动的那一部分对象的标记记录。
4)并发清除:清除垃圾。
并发指的是GC线程与用户线程一同执行。
CMS缺点:
1)占用cpu,导致用户程序变慢。
2)无法清除浮动垃圾:并发清除时用户线程产生的垃圾。
可能导致Concurrent mode failure,从而引发另一次Full GC,系统将采用serial old收集器进行一次GC。
3)标记-清除算法导致内存碎片。解决办法:每CMSFullGCsBeforeCompaction次不压缩的GC,进行一次压缩的GC。
6 G1收集器