我知道在Java中,如果一个对象不再有任何对它的引用,垃圾回收器会在一段时间后回收它。
但是垃圾收集器如何知道对象是否有关联的引用呢?
垃圾收集器是否使用了某种hashmap或表?
编辑:
请注意,我并不是问gc一般是如何工作的。真的,我不是在问这个问题。
我特别问,gc如何高效地知道哪些对象是活动的,哪些是死亡的。
这就是为什么我在我的问题中说,gc维护某种hashmap或set,并一致地更新对象的引用数量?
发布于 2012-05-15 01:06:04
典型的现代JVM使用几种不同类型的垃圾收集器。
一种经常用于已存在一段时间的对象的类型称为Mark-and-Sweep。它基本上涉及从已知的“活动”对象(所谓的垃圾收集根)开始,遵循所有对象引用链,并将每个可到达的对象标记为“活动的”。
一旦完成此操作,清除阶段就可以回收那些未标记为“活动”的对象。
要使此过程正常工作,JVM必须知道每个对象引用在内存中的位置。这是垃圾收集器成为 (Java的是)的必要条件。
发布于 2012-05-15 01:17:52
Java有各种不同的垃圾收集策略,但它们基本上都是通过跟踪已知的活动对象可以到达的对象来工作的。
在文章How Garbage Collection works in Java中可以找到一个很好的总结,但是对于真正的细节,您应该看看Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine
当运行中的程序中的任何指针都不能再到达一个对象时,它被认为是垃圾。最直接的垃圾收集算法只是遍历每个可到达的对象。剩下的任何对象都会被认为是垃圾。这种方法所需的时间与活动对象的数量成正比,这对于维护大量活动数据的大型应用程序来说是禁止的。
从J2SE Platform V1.2开始,虚拟机合并了许多不同的垃圾收集算法,这些算法使用分代收集进行组合。虽然朴素的垃圾收集检查堆中的每个活动对象,但分代收集利用了大多数应用程序的几个经验上观察到的属性来避免额外的工作。
在这些观察到的属性中,最重要的是婴儿死亡率。..。
也就是说,许多像迭代器这样的对象只存在很短的时间,所以较年轻的对象比较老的对象更有可能被垃圾回收。
有关更多最新的优化指南,请查看:
顺便说一句,要小心地猜测你的垃圾收集策略,我知道许多程序的性能会因为过度热衷于使用System.gc()
或不适当的-XX
选项而变得垃圾。
发布于 2012-05-15 01:07:40
GC将知道可以尽可能快地删除对象。您不需要管理此流程。
但您可以非常礼貌地要求GC使用System.gc()
运行。这只是对系统的一个提示。因为GC是大老板,而我们(Java程序员)只是它的从属……:(
https://stackoverflow.com/questions/10587868
复制相似问题