【发布时间】:2012-07-28 09:41:12
【问题描述】:
作为一个新创建的对象被分配给新的一代。是否有可能将新创建的对象直接分配给老一代或老一代?如果是,那么基于哪些?
【问题讨论】:
-
你不应该担心或关心垃圾收集器的工作原理。
作为一个新创建的对象被分配给新的一代。是否有可能将新创建的对象直接分配给老一代或老一代?如果是,那么基于哪些?
【问题讨论】:
见“Frequently Asked Questions about Garbage Collection in the HotspotTM JavaTM Virtual Machine”:
对象会直接分配到老年代吗?
在 1.4.1 中有两种情况可能会直接分配到 老一代。
如果在年轻代分配失败并且对象是 不包含对对象的任何引用的大数组,它可以是 直接分配到老年代。在某些特定情况下, 该策略旨在避免收集年轻人 从老年代分配。
有一个标志(在 1.4.2 及更高版本中可用) l-XX:PretenureSizeThreshold= 可以设置限制 年轻代分配的大小。任何更大的分配 这不会在年轻一代中尝试,因此将是 从老年代分配出去。
1) 的阈值大小为 64k 字。默认大小为 PretenureSizeThreshold 为 0,表示可以分配任何大小 在年轻一代。
在 1.4.2 案例 1) 中,64k 字阈值对于 增量收集器 (-Xincgc)。对于默认收集器和 并发收集器(-XX:+UseConcMarkSweepGC)阈值有 已更改,以便尝试分配到老年代 仅当分配的大小大于整个分配时才会发生 年轻代(空时可用空间)。它被观察到 在某些情况下,默认的 1.4.1 策略 收集器和并发收集器导致完全收集 仅(没有进行年轻代收集)。我们认为 糟糕到提高门槛。
【讨论】: