如果老一代的一个对象需要引用年轻一代的对象呢



假设老一代中有一个对象需要引用年轻一代中的对象。Now when a GC is executed for the young generation, what will happen to that object which is referenced by the object in old generation? Will it continue to be in young generation or moved to young generation or GCed?

还有这个卡片表,它决定了次要GC的对象。How does it work in the above context?

请参阅生成垃圾收集:此外,运行时系统通过观察引用的创建和覆盖来维护引用何时跨代的知识。当垃圾收集器运行时,它可能能够使用这些知识来证明初始白集中的一些对象是不可访问的,而不必遍历整个引用树。如果世代假设成立,这将导致aster收集循环,同时仍然回收大多数无法访问的对象。"

因此,为了回答你的问题,它将像往常一样保持活力,并从一个空间提升到另一个空间。

对于每个对象,GC都会跟踪它经过了多少GC循环。将一个对象"提升"到不同池的决定是按对象的决定。如果有对对象的活动引用是根引用(而不是循环依赖),则不会对对象进行垃圾收集。这个决定是在对特定池的对象进行了收集评估(GC在其池上运行)之后做出的。换句话说,如果该对象有一个活动引用,它将不会被收集。任何没有实时引用的对象都将被收集,无论它们存在于哪个池中。池实际上是GC优化的问题:为了使GC尽可能快,旧池中的对象(Survivors、Permgen等)的评估频率不如年轻一代中的对象。

我认为您误解了GC在几代人中的工作方式。当我们说年轻一代或老年一代时,那么一个物体属于他们中任何一个的主要基础取决于他们的寿命,而不是彼此的参考。

因此,要回答您的问题,请选择No。它将保持年轻(或可能移动到较旧),这取决于它初始化的时间。Referencing用于(例如在"标记和扫描"中)查看对象是否是强可达的,而不是决定生成。

就其本身而言,如果你按照你的逻辑思考,那么所有局部变量或对象,即使寿命很短,也应该直接放在老一代,因为老一代的对象引用了所有这些变量或对象:)。幸运的是,事实并非如此。

最新更新