仔细阅读有关Generational Heap的JVM Garbage Collection Tuning
Guide,它有望回答您的问题。
使用
-XX:+PrintGCDetailsoption 运行Java ,一切应该变得清晰:
Heap PSYoungGen total 3584K, used 294K [0x00000000fbd60000, 0x00000000fc160000, 0x0000000100000000) eden space 3072K, 9% used [0x00000000fbd60000,0x00000000fbda9860,0x00000000fc060000) from space 512K, 0% used [0x00000000fc0e0000,0x00000000fc0e0000,0x00000000fc160000) to space 512K, 0% used [0x00000000fc060000,0x00000000fc060000,0x00000000fc0e0000) PSOldGen total 136576K, used 136576K [0x00000000f3800000, 0x00000000fbd60000, 0x00000000fbd60000) object space 136576K, 100% used [0x00000000f3800000,0x00000000fbd60000,0x00000000fbd60000) PSPermGen total 21248K, used 2595K [0x00000000ee600000, 0x00000000efac0000, 0x00000000f3800000) object space 21248K, 12% used [0x00000000ee600000,0x00000000ee888db0,0x00000000efac0000)
您的200M Java堆由2代组成:1/3(66.7M)是YoungGen,而2/3(133.3M)是OldGen。
-XX:NewRatio选项允许更改比例,但是默认值2表示YoungGen将保留堆的1 /(2 + 1)部分。
Java对象不能跨越几代,因此对象的最大大小不能大于最大代。在您的情况下,最大的一代是OldGen:136576K =
139853824,正好是
char[69926904](16字节头+ 2 * 69926904字节数据)的大小。



