GC算法是内存回收的方法论,垃圾收集器是算法落地的实现。
四种主要垃圾收集器:
⑴ 串行垃圾收集器(Serial): 只使用一个线程进行垃圾回收,会暂停所有的用户线程
;
⑵ 并行垃圾收集器(Parallel): 多个垃圾收集器线程并行工作,会暂停所有的用户线程
;
⑶ 并发垃圾收集器(CMS): 用户线程和垃圾收集器线程同时执行,用户程序在继续运行,垃圾收集程序线程运行于另一个CPU上
;
⑷ G1垃圾收集器 : 将堆内存分割成不同的区域,并发对其进行垃圾回收
;
查看默认的垃圾收集器:java -XX:+PrintCommandLIneFlags -version
;
新生代收集器:Serial、ParNew、Parallel Scavenge;
老年代收集器:Serial Old、Parallel Old、CMS;
整堆收集器:G1;
注:
新生代不管使用哪种都是使用复制算法;
老年代使用CMS时是标记清除算法,其他使用标记压缩算法;
Serial(串行) : 最基本、发展历史最悠久的收集器
;
ParNew(并行) : Serial收集器的多线程版本
;
Parallel Scavenge(并行) : 与吞吐量关系密切,也称为吞吐量收集器
;
Serial Old(串行) : Serial收集器的老年代版本
;
Parallel Old(并行) : Parallel Scavenge收集器的老年代版本
;
CMS(并发) : 也称为并发低停顿收集器(Concurrent Low Pause Collector)或低延迟(low-latency)垃圾收集器
;
CMS 四步过程:
1.初始标记: 仅标记GC Roots能直接关联到的对象,速度很快, 但需要"Stop The World"
;
2.并发标记: 从第一步标记的对象出发,并发标记可达对象 (用户线程不会暂停)
;
3.重新标记: 修正并发标记期间因用户程序继续运作而导致标记变动的那一部分对象的标记记录,需要"Stop The World"
;
4.并发清除: 回收所有的垃圾对象
;
设置参数:
设置参数新生代 | 新生代 | 老年代 |
---|---|---|
-XX:+UseSerialGC | Serial GC | Serial Old GC |
-XX:+UseParNewGC | ParNew GC | Serial Old GC |
-XX:+UseParallelGC | ParNew Scavenge GC | Parallel Old GC |
-XX:+UseConcMarkSweepGC | ParNew GC | CMS |
如何选择垃圾收集器:
单CPU或小内存:-XX:+UseSerialGC
;
多CPU追求大吞吐量(如后台计算应用):-XX:+UseParallelGC
;
多CPU追求低停顿时间:-XX:+UseConcMarkSweepGC
;