深入理解java虚拟机(三)常见垃圾回收器

1.各个收集器之间的关系:

          

2.七种垃圾收集器:

        1.Serial收集器:单线程的收集器(在进行垃圾收集时会暂停其它所有的的工作线程,直到收集结束)当回收区域较大时

就会暂停时间较长。

        2.ParNew收集器:Serial的多线程版本

        3.Parallel Scavenge收集器:并行清理 并行垃圾收集器,与ParNew的区别:ParNew通常与CMS搭配,一般注重于减少垃圾回收的停顿时间,提高响应速度,而Parallel Scavenge侧重于吞吐量的控制吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间)。不能和CMS搭配。

       4.CMS垃圾收集器:CMS收集器是以获取最短停顿时间为目标的收集器,基于“标记-清除”算法

                (1)初始标记  需要Stop the world(2)并发标记  需要Stop the World(3)重新标记 (4)并发清除

                   CMS的内存回收过程是与用户线程一起并发执行的

                   缺点:

                   (1)CMS收集器对CPU资源十分敏感

                   (2)CMS收集器无法处理浮动垃圾,可能出现“Conurrent Mode Failure”失败从而导致另外一次Full GC

                     浮动垃圾:CMS并发清理阶段出现的垃圾

                   (3)在收集结束时会有大量的空间碎片。给大对象分配带来麻烦

        5.G1收集器的原理与实现:G1是一款面向服务端应用的垃圾收集器

                     特点:

                      (1)并行与并发:能够使用多个CPU来缩短Stop-the-World

                      (2)分代收集

                      (3)空间整合(局部看是基于复制算法,从整体来看是基于标记-整理 算法)

                      (4)可预测的停顿

  •  将堆分为大小相等的独立区域,避免全区域的垃圾收集;新生代和老年代不再物理隔离,只是部分Region的集合
  • G1跟踪各个Region垃圾堆的价值大小,后台维护一个优先列表,根据允许的收集时间优先回收价值最大的Region                   
  • Region之间的对象引用以及其他收集器中的新生代与老年代之间的对象引用,采用Remembered Set来避免全堆扫描;
初始标记(标记一下GC Roots能直接关联的对象并修改TAMS值,需要STW但耗时很短)
并发标记(从GC Root从堆中对象进行可达性分析找存活的对象,耗时较长但可以与用户线程并发执行)
最终标记(为了修正并发标记期间产生变动的那一部分标记记录,这一期间的变化记录在Remembered 
Set Log里,然后合并到Remembered Set里,该阶段需要STW但是可并行执行)
筛选回收(对各个Region回收价值排序,根据用户期望的GC停顿时间制定回收计划来回收);

6.Serial-old:Serial的年老代

7.Parallel Old:.Parallel Scavenge的年老代

常见面试题:

(1)我想追求吞吐量该用哪种垃圾回收器:CMS

(2)年老带可以用哪些垃圾回收器

      1.G1 2.CMS 3.Serial Old 4.Parallel Old

  (3)哪些东西能直接进去老年代

          1.大对象:所谓的大对象是指需要大量连续内存空间的java对象。

          2.长期存活的对象:虚拟机给每个对象定义了一个对象年龄(Age)计数器,如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并且对象年龄设为1,。对象在Survivor区中每熬过一次Minor GC,年龄就增加1,当他的年龄增加到一定程度(默认是15岁), 就将会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数-XX:MaxTenuringThreshold设置。

            3.动态对象年龄判定:为了能更好地适应不同程度的内存状况,虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升到老年代,如果在Survivor空间中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。

(4)为什么新生代用复制算法:

主要是新生代对象存活率低,复制算法只复制可以存活的对象,清理掉没必要存活的对象,所以执行速度比标识--清除要快吧。

  

猜你喜欢

转载自blog.csdn.net/weixin_42173193/article/details/87908422