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

Tho*_*hor 3 java variables swift

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

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

Tho*_*ger 8

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

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

这两种方法都有利有弊:

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

  • @Basilevs 这不是唯一的问题。当计数器达到零时,引用计数 gc *必须*采取行动,即释放对象的内存,这归结为要记住这块(可能相当小的)内存是空闲的,即使可能永远不再需要该内存。然后,这些块必须在某个点(如果可能)合并,以获得更大的连续空闲内存块。复制/压缩GC仅在真正需要内存时运行,并且本质上会产生一个大的连续的空闲内存块。如果有足够的备用内存,效率会更高。 (2认同)

归档时间:

查看次数:

498 次

最近记录:

7 年,11 月 前