JVM的学习6____垃圾回收器

     当我们了解完垃圾回收算法后,我们正式的一起来的JVM到自动内存管理工具的实现----即GC(即可完成内存分配,也可进行垃圾回收)。我们会了解到一些常见的GC版本,比如:Serial/Serial Old收集器,Parallel/Parallel Old收集器,CMS(Concurrent Mark Sweep)

   在了解GC之前我们先了解两个重要的概念:

  • 串行还是并行回收;
  • 并发还是Stop the world机制;
  1. 串行回收:即就是当机器中运行多个CPU时,只能有一个CPU来进行垃圾回收的工作,并且当进行垃圾回收时,其他工作线程就会停止掉。
  2. 并行回收:多个CPU均可同时执行垃圾回收,因此提升了应用程序的吞吐量,不过并行回收中依然用到了“stop the world”机制和复制算法。
  3. stop the world 机制:在并行回收中的stop the world机制,当垃圾回收器在进行回收时,会暂停掉所有的工作线程,直到完成内存回收,才会继续之前被暂停的工作线程。当stop the world机制应用于Minor GC时,由于新生代内存空间比较小所以被暂停的时间不会很常,可是在老年代的Full GC中使用stop the world 机制时,由于内存空间比较大所以线程被暂停需要等待的时间就会更长。由此可见,stop the world 机制线程被暂停等待时间的长短和Java堆索管理的内存大小有关,内存空间越大,执行Full GC的时间就会更久,所以工作线程被暂停的时间就会更久。 
  4. 并发回收:由于并行回收中的stop the world 机制对工作线程暂停的时间比较久,所以提出的并发回收就是来缩短stop the world的线程暂停时间,因为并发回收中垃圾回收线程和工作线程在同一时间内可以同时执行。
  • 值得注意的是:不管多么优秀的GC,也还是避免不了stop the world需要等待的时间,也就是尽可能的缩短而已。

 串行回收:Serial / Serial Old收集器:

  •  Serial:应用于新生代 采用复制算法 ,串行回收,stop the world机制。
  • Serial Old:应用于老年代,采用标记-压缩算法,stop the world机制。
  • 可以通过 -XX:+UseSerialGC 手动的指定使用Serial回收器。

并行回收:ParNew收集器:

ParNew相当于是Serial的多线程版本,比如在新生代也是采用复制-清理算法,stop the world 机制。

  • 使用-XX:UseParNewGC 可以手动指定使用ParNew收集器执行内存回收。

程序吞吐量优先:Parallel / Parallel Old收集器:

Parallel收集器:并行回收,复制算法,stop the world机制;Paralle收集器相比于ParNew收集器不同点在于,Parallel收集器可以手动的控制应用程序的吞吐量,也可以设置stop the world机制暂停时间的阈值。

      

       吞吐量和低延迟:当为了保证吞吐量时,GC会尽可能的降低程序内存回收执行的频率,由此一来当下一次GC时,需要清理的垃圾就会很多,导致stop the world 需要等待的时间就越多,就做不到低延迟。当要保证低延时时:就会频繁的进行垃圾回收,一次来降低垃圾回收所需要的时间,但是这又会对吞吐量造成影响。所以说:吞吐量和低延迟是相互相互竞争的矛盾。

低延迟:CMS(Concurrent Mark Sweep)收集器:

CMS(Concurrent Mark Sweep):保证低延迟的 并行垃圾回收器,是一款老年代的垃圾回收器垃圾回收算法采用标记-清理算法,也会因为stop the world 机制而暂停。

CMS的工作流程比较复杂,答题可以分为如下几个步骤:

  1. 初始标记阶段;  stop the world,采用根搜索法找出不可达的对象;
  2. 并发标记阶段;  将不可达对象标记成垃圾对象;
  3. 再次标记阶段;  stop the world,保证被标记的垃圾对象的正确性,由于是并行回收对象的状态可能发生改变;
  4. 并发清理阶段;  清理垃圾对象,进行内存回收;

注意:之前的几种垃圾收集器在老年代使用的是标记-压缩清理算法,而CMS(Concurrent Mark Sweep)老年代使用的是标记-清理,这就意味着给新对象分配内存时不能使用指针碰撞进行,而采用空闲列表法执行内存分配。

猜你喜欢

转载自www.cnblogs.com/xbfchder/p/11403307.html