Java垃圾回收器(一)

垃圾收集器组合

JDK7/8后,HotSpot虚拟机所有收集器及组合(连线),如下图:


image
  • 图中展示了7种不同分代的收集器:
    Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;

  • 而它们所处区域,则表明其是属于新生代收集器还是老年代收集器:
    新生代收集器:Serial、ParNew、Parallel Scavenge;
    老年代收集器:Serial Old、Parallel Old、CMS;
    整堆收集器:G1;

  • 两个收集器间有连线,表明它们可以搭配使用

  • 其中Serial Old作为CMS出现"Concurrent Mode Failure"失败的后备预案

Serial收集器

Serial(串行)垃圾收集器是最基本、发展历史最悠久的收集器;
JDK1.3.1前是HotSpot新生代收集的唯一选择;
1、特点

针对新生代
采用复制算法
单线程收集;
进行垃圾收集时,必须暂停所有工作线程,直到完成;
即会"Stop The World";

Serial/Serial Old组合收集器运行示意图如下:


image

2、应用场景

依然是HotSpot在Client模式下默认的新生代收集器
优于其他收集器的地方:

  • 简单高效(与其他收集器的单线程相比);
  • 对于限定单个CPU的环境来说,Serial收集器没有线程交互(切换)开销,可以获得最高的单线程收集效率;
  • 在用户的桌面应用场景中,可用内存一般不大(几十M至一两百M),可以在较短时间内完成垃圾收集(几十MS至一百多MS),只要不频繁发生,这是可以接受的

3、设置参数

"-XX:+UseSerialGC":添加该参数来显式的使用串行垃圾收集器;

ParNew收集器

ParNew垃圾收集器是Serial收集器的多线程版本

1、特点

除了多线程外,其余的行为、特点和Serial收集器一样

ParNew/Serial Old组合收集器运行示意图如下:


image

2、应用场景

Server模式下,ParNew收集器是一个非常重要的收集器,因为除Serial外,目前只有它能与CMS收集器配合工作
但在单个CPU环境中,不会比Serail收集器有更好的效果,因为存在线程交互开销。

3、设置参数

"-XX:+UseConcMarkSweepGC":指定使用CMS后,会默认使用ParNew作为新生代收集器;
"-XX:+UseParNewGC":强制指定使用ParNew;
"-XX:ParallelGCThreads":指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容