2

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

4

3 回答 3

1

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

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

于 2013-07-27T06:51:34.747 回答
0

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

那么回答你的问题No。根据初始化的时间,它将保持年轻(或可能移至较旧)。Referencing用于(用于标记和扫描中的 ex)来查看对象是否是强可达的,而不是决定生成。

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

于 2013-07-26T10:52:27.593 回答
0

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

于 2013-07-27T06:45:41.217 回答