6

作为一个新创建的对象被分配给新的一代。是否有可能将新创建的对象直接分配给老一代或老一代?如果是,那么基于哪些?

4

1 回答 1

8

请参阅“有关 HotspotTM JavaTM 虚拟机中垃圾收集的常见问题”:

对象会直接分配到老年代吗?

在 1.4.1 中有两种情况,分配可能直接发生在老年代。

如果年轻代分配失败,并且对象是一个不包含任何对象引用的大数组,则可以直接将其分配到年老代。在某些特定情况下,此策略旨在通过从老年代分配来避免收集年轻代。

有一个标志(在 1.4.2 和更高版本中可用)l-XX:PretenureSizeThreshold= 可以设置来限制年轻代的分配大小。任何大于此的分配都不会在年轻代中尝试,因此将被分配到老年代之外。

1) 的阈值大小为 64k 字。PretenureSizeThreshold 的默认大小为 0,表示可以在年轻代中分配任何大小。

在 1.4.2 案例 1) 中,增量收集器 (-Xincgc) 的 64k 字阈值仍然有效。对于默认收集器和并发收集器(-XX:+UseConcMarkSweepGC),阈值已更改,因此只有在分配的大小大于整个年轻代(可用空间时它是空的)。据观察,在某些情况下,默认收集器和并发收集器的 1.4.1 策略仅导致完全收集(没有进行年轻代收集)。我们认为这足以提高门槛。

于 2012-07-30T17:18:47.130 回答