Java:垃圾回收算法

## 常见算法

  • 引用计数:循环引用问题
  • 标记 - 清除算法:速度快,但有内存碎片
  • 标记 - 整理算法:速度慢,无内存碎片
  • 复制算法:无内存碎片,占用内存大
  • 分代垃圾收集:综合若干算法

## 问题

###1、引用计数中,循环引用如何产生? 例如这段代码(来自[深入理解 java 垃圾回收机制]):

public class Main {
    public static void main(String[] args) {
        MyObject object1 = new MyObject();
        MyObject object2 = new MyObject();

        object1.object = object2;
        object2.object = object1;

        // 试图清理

        object1 = null;
        object2 = null;
    }
}

如果采用引用计数,那么在 // 试图清理之前:

image.png

object1 = null;
object2 = null;

之后:

image.png

两个对象之间仍然存在互相引用,可惜没有变量名可以访问它们了…

###2、如何标记 - 整理? 若对象 A 中引用了 B,当对 B 进行挪动时,如何保证 A 保存的 B 的位置仍然是 B?

不清楚,这个是底层实现的问题。一个思路:B 中也存放(隐式存放,不当作引用)了 A 的位置,当 B 的位置变化,B 可以通知 A 更新 B 的位置。

在基于 Compacting 算法 (例如标记 - 整理) 的收集器的实现中,一般增加句柄和句柄表。

###3、为什么标记 - 整理比标记 - 清除慢? 标记-整理的第 1 步是标记-清除,之后进行整理,多了一个整理的时间。

###4、复制算法比标记整理算法更? 快一些。复制算法的目标是为了克服句柄的开销和解决堆碎片。

###5、标记 - 清除算法中标记的什么?清除的什么? 标记存活的对象,删除未被标记的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值