据我所知,在Java中,如果一个对象不具有任何引用任何更多,垃圾收集器会后回收回来一段时间。
但如何垃圾收集器知道对象已经或没有相关引用它?
是垃圾收集器使用某种类型的HashMap或表?
编辑:
请注意,我不问如何一般GC的作品。 真的,我不要求这一点。
我问具体是怎样的GC知道哪些对象是活的,哪些是死的,有效率。
这就是为什么我在我的问题是GC保持某种的HashMap或一套,始终更新引用的对象具有数量说呢?
据我所知,在Java中,如果一个对象不具有任何引用任何更多,垃圾收集器会后回收回来一段时间。
但如何垃圾收集器知道对象已经或没有相关引用它?
是垃圾收集器使用某种类型的HashMap或表?
编辑:
请注意,我不问如何一般GC的作品。 真的,我不要求这一点。
我问具体是怎样的GC知道哪些对象是活的,哪些是死的,有效率。
这就是为什么我在我的问题是GC保持某种的HashMap或一套,始终更新引用的对象具有数量说呢?
典型的现代JVM使用几种不同类型的垃圾收集。
这往往用于已经存在了一段时间的对象一类叫做马克和清除 。 它基本上包括从已知的“活”的对象(即所谓的垃圾回收根 )开始,对象引用的所有连锁以下,和标记每个可到达的对象是“活”的。
一旦做到这一点,在吹扫阶段可以收回没有被标记为“活”的对象。
对于这个程序运行时,JVM必须知道每一个对象引用的内存位置。 这是一个垃圾收集器的必要条件是精确 (其Java的是)。
Java有各种不同的垃圾收集策略,但他们基本上都通过跟踪对象是从已知的活动对象到达工作。
一个伟大的总结可以在文章中找到垃圾收集在Java中是如何工作的 ,但对于真正的低下来,你应该看看调整垃圾回收与5.0的Java(TM)虚拟机
一个对象被认为是垃圾时,它不再能够从正在运行的程序的任何指针到达。 最直截了当的垃圾收集算法简单地遍历所有可达对象。 那么剩下的所有对象都认为是垃圾。 这种方法需要的时间是成正比的活动对象的数量,这是令人望而却步的大型应用程序保持大量的实时数据。
与J2SE平台版本1.2开始,虚拟机结合的一定数量的使用代收集组合不同的垃圾收集算法。 而天真的垃圾收集检查堆中的每个活动的对象,代收集利用的大多数应用的多种经验观察性,以避免额外的工作。
其中最重要的观察到的特性之一是婴儿死亡率。 ...
即像许多迭代器对象只住了很短的时间,这么年轻的对象更可能是符合垃圾收集比老得多的对象。
欲了解更多最新的调整指南,来看看:
顺便说一句,小心试图第二猜测你的垃圾收集策略,我早就知道了超过热心使用被丢弃许多程序的性能System.gc()
或不适当的-XX
选项。
GC会知道,对象可以以最快的速度有可能移出。 你是不是希望管理这一过程。
但是,你可以问GC很客气地用跑System.gc()
这仅仅是一个提示系统。 GC不必在那一刻运行,它并没有删除您的特定对象等等。因为GC是大老板,我们(Java程序员)都只是它的奴隶... :(