[JVM知识点梳理]JVM之垃圾回收机制

2019-03-28  本文已影响0人  满天星爱我

垃圾收集器在对堆进行回收前,需要先确定这些对象中哪些还“存活”着,哪些已经“死去”(也就是不被任何引用类型所引用)。

基于这个目前有两种算法可判断对象是否存活

引用计数算法

给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器就减1;任何时刻计数器为0的对象就是不可能再被使用的。

优点:

缺点:

可达性分析算法

通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

可作为GC Roots的对象包括下面几种

引用

生存还是死亡

即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:

垃圾收集算法

标记 - 清除算法

定义
缺点

复制算法

定义
优点
缺点

现在的商业虚拟机都采用这种收集算法来回收新生代,新生代的对象98%是朝生夕死的,所以并不需要按照1 : 1的比例来划分内存空间,而是将内存分为一块较大的Eden和两块较小的Survivor空间,每次使用Eden和其中的一块Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性的拷贝到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor的空间。Hotspot虚拟机默认Eden和Survivor的大小比例是8 : 1。

标记-整理算法

定义

分代收集算法

定义

垃圾收集器

如下图展示了7中不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。

Serial 收集器

特点

ParNew收集器

特点

Parallel Scavenge收集器

特点

Serial Old收集器

特点

Parallel Old收集器

特点

CMS收集器

特点

它的运作过程相对复杂,整个过程分为4个步骤,包括:

其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录

由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMG收集器的内存回收过程是与用户一起并发地执行的,如下图可以比较清楚地看到CMS收集器的运作步骤中并发和需要停顿的时间

image.png

它的主要优点

它有三个显著的缺点

G1收集器

G1收集器是垃圾收集器理论进一步发展的产物,它与前面的CMS收集器相比有两个显著的改进:

G1将整个Java堆(包括新生代、老年代)划分为多个大小固定的独立区域,并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域。区域划分及有优先级的区域回收,保证了G1收集器在有限的时间内可以获得最高的收集效率。

内存回收策略

对象分配规则

对象优先在Eden区分配。

大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC

大对象直接进入老年代
长期存活的对象将进入老年代

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

动态对象年龄判定

如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。

空间分配担保

当发生Minor GC时,虚拟机会检测之前每次晋升到老年代的平均大小是否小于老年代的剩余空间大小,如果大于,则改为直接进行一次Full GC。如果小于,则查看HandlePromotionFailure设置是否允许担保失败;如果允许,那只会进行Minor GC;如果不允许,则也要改为进行一次Full GC。

注意

  • 新生代GC(Minor GC): 指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性。所以Minor GC 非常频繁,一般回收速度也比较快。
  • 老年代GC(MajorGC/Full GC):
    指发生在老年代的GC,出现了Major GC,经常会伴随着至少一次的Minor GC(但非绝对的,在ParalleScavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。MajorGC的速度一般会比Minor GC慢10倍以上
上一篇 下一篇

猜你喜欢

热点阅读