为什么JVM的GC喜欢不可变的目标?

Jac*_*cky 9 garbage-collection jvm object immutability

我知道JVM GC喜欢短期对象的原因,因为它可以在次要GC中收集.但是为什么JVM GC喜欢不可变对象呢?

编辑:查理亨特说,GC在他的演讲中喜欢不可变的对象.

谢谢

sup*_*cat 8

如果GC可以知道对象不包含对任何gen0对象的任何引用,则在执行gen0集合时可以忽略它.同样,如果一个对象不包含对任何gen0或gen1对象的任何引用,则在执行gen1集合时可能会忽略它.在集合期间可以忽略的对象越多,集合就越快.

如果一个对象在gen0 GC中存活,则可以确定它所拥有引用的任何gen0对象都将被提升为gen1; 同样,如果一个不包含任何gen0引用的对象在gen1 GC中存活,那么它包含的任何gen1引用都将被提升为gen2.因此,一旦在gen0集合期间检查了一个对象,就不需要再次检查它,直到下一代gen1集合,除非它被修改.同样,在gen1集合期间检查的对象不需要在下一代gen2集合之前进行检查,除非它被修改.

知道对象是否被修改是一个棘手的主题,但关键是如果没有对象,它对GC非常有利.

  • ...从当前执行范围中传出,这些对象不需要具有与跟踪它们是否已经改变相关联的机制(因为它们根本不会改变); 或者,在任何支持虚拟内存机制的系统上,如果虚拟内存机制足够复杂,可以跟踪可变对象的变化(甚至许多虚拟机制都受到更多限制),那些相同的机制可用于确保不可变对象甚至无法更改通过"流氓"代码. (2认同)