如果老一代的对象需要引用年轻一代的对象怎么办?

时间:2013-07-26 09:19:06

标签: java garbage-collection heap-memory

让我们说老一代中有一个对象需要引用年轻一代的对象。 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?

3 个答案:

答案 0 :(得分:0)

我认为你误解了GC与几代人一起工作的方式。当我们说年轻或老一代时,属于其中任何一个的对象的主要基础取决于它们的寿命而不是相互引用。

所以回答你的问题然后No。它将保持年轻(或可能会移动到更旧),具体取决于它何时初始化。使用Referencing(对于Mark和Sweep中的ex)来查看对象是否可以强烈访问而不是决定生成。

如果按照你的逻辑思考,那么所有局部变量或对象,即使生命周期短,也应该直接放在老一代中,因为老一代的对象引用了所有这些变量:)。幸运的是,它不是那样的。

答案 1 :(得分:0)

对于每个对象,GC会跟踪它经过的GC循环次数。将对象“推广”到不同池的决定是每个对象的决定。 如果对象的实时引用是有根的(不是循环依赖),则不会对对象进行垃圾回收。 在评估特定池的对象进行收集(GC在其池上运行)之后,将做出此决定。换句话说,如果该对象具有实时引用,则不会收集它。任何没有实时引用的对象都将被收集,而不管它们存在于哪个池中。池实际上是GC优化的问题:尽可能快地使GC,旧池(幸存者,Permgen等)中的对象不被评估为经常作为年轻一代的对象。

答案 2 :(得分:0)

参见Generational Garbage Collection:“此外,运行时系统通过观察引用的创建和覆盖来维护引用何时跨代的知识。当垃圾收集器运行时,它可能能够利用这些知识来证明某些初始白色集合中的对象无法访问而无需遍历整个参考树。如果世代假设成立,这将导致更快的收集周期,同时仍然可以回收大多数无法到达的对象。“

所以为了回答你的问题,它会像往常一样保持活力并从太空升级到太空。