本文主要介绍了JVM虚拟机中非常重要的两个部分,GC 回收算法和垃圾收集器。从可回收对象的标记开始,详细介绍 了四个主流的GC算法,详细总结了各自的算法思路及优缺点, 提出了何种情况下应该通常选用哪种算法。
目录
1 标记可回收对象
1.1 引用计数器
1.2 可达性分析算法
2 垃圾回收算法
2.1 清除算法
2.2 复制算法
2.3 标记 - 整理算法
2.4 分代收集算法
3 结束语
1 标记可回收对象
堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象)。这个过程就是在后面垃圾收集器频繁涉及的标记过程。
1.1 引用计数器
这个方法简单易懂,就是给对象添加一个引用计数器,一 旦该对象被引用,计数器 +1,当引用失效,计数器就 -1。此 时计数器为 0 的对象就是不可用对象。现在几乎已经没有JVM使用引用计数法来判断对象是否可被回收了,因其无法解决对象之间互相循环引用的问题。故现在一般使用下面的可达性分析算法。
1.2 可达性分析算法
可达性算法也叫根搜索法。这个算法的基本思想就是通过 一系列”GC Roots“对象作为起点,从这些节点向下开始搜索, 节点所走过的路径称为引用链,当一个对象到GCRoots没有任何引用链相连的话,则证明此对象是不可用的。
这里要注意的是,即便在可达性算法中被判定为不可达对象,该对象也不是要绝对被清除的,还要经历再次被标记才能真正被回收。此时就需要调用 finalize() 方法最终判定对象是否存活。
首先要对第一次标记进行一次筛选,以筛选出此对象是否有必要执行finalize() 方法。当这个对象没有覆盖finalize方法,或者finzlize方法已经被虚拟机调用过,则被视为“没有必要执行“,对象被回收。
如果被判定为“有必要执行”,则对象将会被放置在 F-Queue 队列之中,在第二次GC对F-Queue中的对象进行标记的过程中, 如果对象能够抓住最后一次机会,与引用链上的某一对象建立联系,便可被移出,否则将被回收。
2 垃圾回收算法
垃圾回收算法,又叫GC算法,其中包含标记 - 清除算法、 复制算法、标记 - 整理算法和分代收集算法等。下面将详细分析一下这四种常用算法。
2.1 清除算法
这是一个最基础的收集算法,这个算法分为标记”和”清 除“两个阶段。首先标记出所有需要回收的对象,也就是用上面可达性分析算法进行的标记,在标记完成后统一回收所有被标记的对象。它有两个不足的地方:效率问题和空间问题。两个过程的效率都不高而且标记清除后会产生大量不连续的碎 片,碎片过多会导致以后程序运行时需要分配较大对象时,无法找到足够的连续内存,而不得已再次触发GC,会造成GC频繁,故常用复制算法和标记 - 整理算法作为改进算法。
2.2 复制算法
复制算法的思路是把内存分为大小相同的两块,每次只使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块区,并且整齐排列好,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收,也不用考虑内存碎片问题,简单高效。
这个算法就和新生代的 from 区和 to 区的过程很像,所以这个算法比较适合新生代。赋值的时候因为都是很小的对象空间,所以效率还是比较高的,但是缺点很明显,只有一半的内存被利用起来,浪费了内存空间。所以这个算法不适合老年代, 因为老年代会存储大对象,如果用这个算法就会导致内存不足次数变频繁,会使 Major GC 变频繁,导致效率降低。
2.3 标记 - 整理算法
标记 - 整理算法也叫标记 - 压缩算法,标记过程和“标记 - 清除”算法一样,基本思路是让所有存活的对象向一端移动,然后直接清理掉边界以外的内存。这样做直接避免了标记 - 清除算法的碎片问题和复制算法所涉及的空间问题。这也是操作系统中常用的紧凑操作,紧凑操作之后再执行动态重定位分区分配算法,更新内存中存活对象的新地址。
2.4 分代收集算法
现在的商用虚拟机的垃圾收集器基本都采用 " 分代收集 " 算法,这种算法就是根据对象存活周期的不同将内存分为几块。 一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。其实就是上面几个算法的汇总。
3 结束语
本文主要介绍了怎样判定一个算法是否被回收,以及四种常用的垃圾回收算法各自的思路及优缺点。文章来源:https://www.toymoban.com/news/detail-620267.html
一般年轻代中执行 GC 后,会有少量的对象存活,就会选用复制算法,只要付出少量的存活对象复制成本就可以完成收集。而老年代中因为对象存活率高,没有额外过多内存空间对 它进行分配担保,就需要使用标记 - 清理或者标记 - 整理算法来进行回收。文章来源地址https://www.toymoban.com/news/detail-620267.html
到了这里,关于小研究 - 浅析 JVM 中 GC 回收算法与垃圾收集器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!