Serial收集器和ParNew收集器

Serial收集器
       Serial(串行)垃圾收集器是最基本、发展历史最悠久的收集器;
       JDK1.3.1前是HotSpot新生代收集的唯一选择;
1、特点
      针对新生代;
      采用复制算法;
      单线程收集;
       进行垃圾收集时,必须暂停所有工作线程,直到完成;            
       即会 "Stop The World"
      Serial/Serial Old组合收集器运行示意图如下:

2、应用场景
      依然是HotSpot在 Client模式下默认的新生代收集器
      也有优于其他收集器的地方:
      简单高效(与其他收集器的单线程相比);
      对于 限定单个CPU的环境 来说,Serial收集器没有线程交互(切换)开销,可以获得最高的单线程收集效率;
      在 用户的桌面应用场景 中,可用 内存一般不大 (几十M至一两百M),可以在较短时间内完成垃圾收集(几十MS至一百多MS),只要不频繁发生,这是可以接受的
3、设置参数
      "-XX:+UseSerialGC" :添加该参数来显式的使用串行垃圾收集器;
4、Stop TheWorld说明
      JVM在后台自动发起和自动完成的,在用户不可见的情况下,把用户正常的工作线程全部停掉,即 GC停顿
      会带给用户不良的体验;
      从JDK1.3到现在,从Serial收集器-》Parallel收集器-》CMS-》G1,用户线程停顿时间不断缩短,但仍然 无法完全消除

ParNew收集器
      ParNew垃圾收集器是 Serial收集器的多线程版本
1、特点
      除了多线程外,其余的行为、特点和Serial收集器一样
      如Serial收集器可用控制参数、收集算法、Stop The World、内存分配规则、回收策略等;
      两个收集器共用了不少代码;
      ParNew/Serial Old组合收集器运行示意图如下:

2、应用场景
      在 Server模式下 ,ParNew收集器是一个非常重要的收集器,因为除Serial外,目前只有它 能与CMS收集器配合工作
      但在 单个CPU环境中,不会比Serail收集器有更好的效果 ,因为存在线程交互开销。
3、设置参数
      "-XX:+UseConcMarkSweepGC" :指定使用CMS后,会默认使用ParNew作为新生代收集器;
      "-XX:+UseParNewGC" :强制指定使用ParNew;    
      "-XX:ParallelGCThreads" :指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;
4、为什么只有ParNew能与CMS收集器配合
      CMS是HotSpot在JDK1.5推出的第一款真正意义上的并发(Concurrent)收集器,第一次实现了让垃圾收集线程与用户线程(基本上)同时工作;
      CMS作为老年代收集器,但却无法与JDK1.4已经存在的新生代收集器Parallel Scavenge配合工作;
      因为 Parallel Scavenge(以及G1)都没有使用传统的GC收集器代码框架 ,而另外独立实现;而其余几种收集器则共用了部分的框架代码;



猜你喜欢

转载自blog.csdn.net/wxy941011/article/details/80653738