Java基础知识+Java虚拟机JVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

JVM系列之GC垃圾回收算法

2021-04-06  本文已影响0人  简楼

前言

之前有提到过,GC的垃圾回收机制以及触发情况,虽然这个都是虚拟机默默执行的,不需要我们手动去GC,但是了解GC的原理,有助于我们码出未来;

GC垃圾回收算法

GC常用算法有:
引用计数法,标记-清除算法,复制算法,标记-整理算法,分代收集算法;
HotSpot虚拟机采用的是分代收集算法;

标记-清除 算法

标记-清除算法对根集合进行扫描,对存活的对象进行标记。标记完成后,再对整个空间内未被标记的对象扫描,进行回收;


image.png

优势:实现简单,不需要进行对象进行移动
缺点:标记、清除过程效率低,产生大量不连续的内存碎片,提高了垃圾回收的频率

复制算法

这种收集算法解决了标记清除算法存在的效率问题。
它将内存区域对半分开。每次仅使用一半的空间,JVM生成的新对象放在一半空间中。当一半空间用完时进行GC,把可到达对象复制到另一半空间,然后把使用过的内存空间一次清理掉;


image.png

优势:按顺序分配内存即可,实现简单、运行高效,不用考虑内存碎片
缺点:可用的内存大小缩小为原来的一半,对象存活率高时会频繁进行复制,而且空间利用率不高

标记-整理算法

标记-整理算法 采用和 标记-清除算法 一样的方式进行对象的标记,但后续不直接对可回收对象进行清理,而是将所有的存活对象往一端空闲空间移动,然后清理掉端边界以外的内存空间


image.png

优势:解决了标记-清理算法存在的内存碎片问题
缺点:需要进行局部对象移动,一定程度上降低了效率

分代收集算法

分代收集算法,顾名思义是根据对象的存活周期将内存划分为几块,将堆分为新生代(Young)和老年代(Tenure),新生代又分为一个eden区和两个survivor区;

大部分被新创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可达,所以很多对象被创建在新生代,然后消失。对象从这个区域消失的过程我们称之为 minor GC;

在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理 或者 标记-清除;


image.png
上一篇下一篇

猜你喜欢

热点阅读