JVM 标志:
-Xms1G -Xmx1G -Xmn500m -XX:PretenureSizeThreshold=100000000 -XX:+PrintGCDetails
通过将年轻代大小固定为 500MB,eden 大约为 384MB,因此任何大于 384MB 的对象都直接进入 OldGen,而小于 384MB 的对象则在 Eden 本身中分配。您可以在下面找到生成用法
字节[] 数组 = 新字节[400*1024*1024];
PSYoungGen total 448000K, used 30720K
eden space 384000K, 8% used
from space 64000K, 0% used
to space 64000K, 0% used
ParOldGen total 536576K, used 409600K
object space 536576K, 76% used
字节[] 数组 = 新字节[300*1024*1024];
PSYoungGen total 448000K, used 337920K
eden space 384000K, 88% used
from space 64000K, 0% used
to space 64000K, 0% used
ParOldGen total 536576K, used 0K
object space 536576K, **0% used**
对于 400MB 分配,eden 使用率为 8%,而 old gen 使用率为 76% 对于 300MB 分配,eden 使用率为 88%,而 old gen 使用率为 0% 所以很明显,所有大小大于 eden 的对象都将直接分配到老一代。
感谢 apangin 和 Jigar 提供宝贵的见解 :)
我认为 -XX:PretenureSizeThreshold 根本没有考虑。