爪哇 - 如何垃圾收集器快速知道哪些对象没有任何更多的对它们的引用?(java - How can

2019-06-24 10:04发布

据我所知,在Java中,如果一个对象不具有任何引用任何更多,垃圾收集器会后回收回来一段时间。

但如何垃圾收集器知道对象已经或没有相关引用它?

是垃圾收集器使用某种类型的HashMap或表?


编辑:

请注意,我不问如何一般GC的作品。 真的,我不要求这一点。

我问具体是怎样的GC知道哪些对象是活的,哪些是死的,有效率。

这就是为什么我在我的问题是GC保持某种的HashMap或一套,始终更新引用的对象具有数量说呢?

Answer 1:

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

这往往用于已经存在了一段时间的对象一类叫做马克和清除 。 它基本上包括从已知的“活”的对象(即所谓的垃圾回收根 )开始,对象引用的所有连锁以下,和标记每个可到达的对象是“活”的。

一旦做到这一点,在吹扫阶段可以收回没有被标记为“活”的对象。

对于这个程序运行时,JVM必须知道每一个对象引用的内存位置。 这是一个垃圾收集器的必要条件是精确 (其Java的是)。



Answer 2:

Java有各种不同的垃圾收集策略,但他们基本上都通过跟踪对象是从已知的活动对象到达工作。

一个伟大的总结可以在文章中找到垃圾收集在Java中是如何工作的 ,但对于真正的低下来,你应该看看调整垃圾回收与5.0的Java(TM)虚拟机

一个对象被认为是垃圾时,它不再能够从正在运行的程序的任何指针到达。 最直截了当的垃圾收集算法简单地遍历所有可达对象。 那么剩下的所有对象都认为是垃圾。 这种方法需要的时间是成正比的活动对象的数量,这是令人望而却步的大型应用程序保持大量的实时数据。

与J2SE平台版本1.2开始,虚拟机结合的一定数量的使用代收集组合不同的垃圾收集算法。 而天真的垃圾收集检查堆中的每个活动的对象,代收集利用的大多数应用的多种经验观察性,以避免额外的工作。

其中最重要的观察到的特性之一是婴儿死亡率。 ...

即像许多迭代器对象只住了很短的时间,这么年轻的对象更可能是符合垃圾收集比老得多的对象。

欲了解更多最新的调整指南,来看看:

  • Java SE 6的热点[TM]虚拟机垃圾收集调优
  • Java平台标准版的HotSpot虚拟机垃圾收集调优指南 (Java SE的8)

顺便说一句,小心试图第二猜测你的垃圾收集策略,我早就知道了超过热心使用被丢弃许多程序的性能System.gc()或不适当的-XX选项。



Answer 3:

GC会知道,对象可以以最快的速度有可能移出。 你是不是希望管理这一过程。

但是,你可以问GC很客气地用跑System.gc() 这仅仅是一个提示系统。 GC不必在那一刻运行,它并没有删除您的特定对象等等。因为GC是大老板,我们(Java程序员)都只是它的奴隶... :(



文章来源: java - How can Garbage Collector quickly know which objects do not have references to them any more?