java - 垃圾收集器如何快速知道哪些对象不再有对它们的引用?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我明白,在Java中,如果一个对象不再有任何引用,那么垃圾收集器会在一段时间后回收它。

但是垃圾收集器如何知道一个对象是否有与之相关的引用?

垃圾回收器是否使用某种散列表或表格?

请注意,我不是问gc如何工作。真的,我不是这样问的。

特别要求,如何gc知道哪些对象是活的,哪些是死的,效率高。

这就是为什么我在我的问题中说gc保持某种散列表或集合,并持续更新对象具有的引用数量?

提问于
用户回答回答于

典型的现代JVM使用几种不同类型的垃圾收集器。

一种经常用于已经存在一段时间的对象的类型称为标记和扫描。它基本上涉及从已知的“活”对象(所谓的垃圾收集根)开始,遵循所有对象引用链,并将每个可到达对象标记为“活”。

一旦完成,扫描阶段就可以回收那些未被标记为“有效”的对象。

为了使此过程起作用,JVM必须知道每个对象引用在内存中的位置。这是垃圾收集器准确的必要条件(这是Java的)。

用户回答回答于

Java有各种不同的垃圾收集策略,但它们基本上都是通过跟踪哪些对象从已知的活动对象访问来工作的。

Garbage Collection如何在Java中工作的文章中可以找到一个很好的总结但对于真正的低端应用,您应该看看使用5.0 Java虚拟机调优垃圾收集

当运行程序中的任何指针不能再到达时,该对象被视为垃圾。最简单的垃圾收集算法只是迭代每个可到达的对象。任何遗留的物体都被认为是垃圾。这种方法需要的时间与活动对象的数量成正比,这对于大型应用程序保持大量活动数据而言是禁止的。 从J2SE平台版本1.2开始,虚拟机包含许多不同的垃圾收集算法,这些算法使用分代集合进行组合。虽然幼稚垃圾收集检查堆中的每个活动对象,但代世代收集利用了大多数应用程序的几个经验观察属性,以避免额外的工作。 这些观察到的特性中最重要的是婴儿死亡率。...

即像迭代器的许多对象只能活很短的时间,所以年轻的对象比旧的对象更有可能有资格进行垃圾回收。

有关更多最新的调优指南,请看看:

顺便提一句,要小心尝试第二次猜测你的垃圾收集策略,我知道许多程序性能会因过度热心System.gc()或不适当的-XX选项而被抛弃。

扫码关注云+社区