仔细阅读有关代堆的 JVM 垃圾回收调优指南,希望它能回答您的问题。
使用选项运行Java,一切都应该变得清晰:-XX:+PrintGCDetails
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这正好是(16字节头+ 2 * 69926904字节数据)的大小。char[69926904]