Java中是否存在强引用循环(或类似内容)的概念,类似于Swift的概念?

时间:2016-10-07 05:05:33

标签: java swift variables

在Swift中,人们非常重视强大的参考周期,以及避免它的不同方法。如果两个变量之间存在强大的参考周期,它们将永远保持在内存中,并且如果通过强引用周期将大图像或视频保存在存储器中,则会导致程序崩溃。

我只是想知道Java中是否存在这样的概念?是否有可能在Java中无意中创建类似于强引用循环的东西?我有几个月的Java经验,但我从来没有听说有人在Java中提到这样的概念,即使Java确实使用引用变量来指向对象。

1 个答案:

答案 0 :(得分:7)

似乎swift使用“引用计数”来检测对象活跃度:每个对象都有一个与之关联的计数器,如果创建了对该对象的新引用则会递增,如果对该对象的引用消失则递减。如果引用计数为零,则对象已死,这意味着没有更多引用它。

另一方面,Java使用“可达性”作为活跃度量:只要存在从某些“运行代码”到对象的引用链,对象就是活着的。

两种方法都有利弊:

  • 引用计数使垃圾收集器的生活更轻松:只需查看引用计数即可知道对象是否存活
  • 另一方面,
  • 引用计数可以在其他死对象之间创建引用循环
  • 可达性意味着垃圾收集器必须从线程可以直接到达的对象开始,并遵循所有引用来标记活动对象
  • 另一方面,
  • 可达性意味着参考周期没有问题:两个对象都可以访问,或者两者都没有