JVM标志:
-Xms1G -Xmx1G -Xmn500m -XX:PretenureSizeThreshold=100000000 -XX:+PrintGCDetails
将年轻代的大小固定为500MB,eden大约占384MB,所有大于384MB的对象直接进入OldGen,小于384MB的对象则分配在Eden中。您可以在下面找到代使用情况。
byte [] array = new byte [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
byte[] array = new byte[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%,而老年代使用率为76%。
对于300MB的分配,eden使用率为88%,而老年代使用率为0%。
因此,所有大小大于eden的对象将直接分配到老年代。
感谢apangin和Jigar提供宝贵的见解 :)
我认为-XX:PretenureSizeThreshold根本没有被考虑。