深入理解Java虚拟机(5)——垃圾收集算法

一.垃圾收集算法(简单介绍思想和发展过程)

1.标记—清除 算法

    首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

不足之处:

(1)效率:标记和清除两个过程效率不高

(2)空间问题:标记清除后会产生大量不连续的内存碎片,空间碎片太多导致以后程序运行时需要分配较大的对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

2.复制算法

将可用内存容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

不足之处:牺牲一半内存。

优化:新生代中的对象百分之九十八是朝生夕死,不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中的一块Survivor空间。当回收时,将Eden和Survivor中还存活的对象一次性地复制到另外一块Survivor空间上,最后清理Eden和刚才用过的Survivor空间,HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,只有百分之十的内存会被浪费。

3.标记—整理算法

  标记完之后让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。

4.分代收集算法

  只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代。

二.HotSpot的算法实现

1.枚举根节点

    可达性分析从GC Roots节点找引用链,作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文中。

     在HotStop的实现中,是使用一组称为OopMap的数据结构来直接得知哪些地方存放着对象引用。

2.安全点

3.安全区域

    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/Muyu_Z/article/details/79891064
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞