JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问题都是因为堆空间造成的 OutOfMemoryError。因此掌握 JVM 关于堆空间的参数配置对于排查线上问题非常重要。
tips:本文所有配置,如无特别说明,均基于JDK1.8。
堆配置
我们使用 -Xms 设置堆的初始空间大小,使用 -Xmx 设置堆的最大空间大小。
java -Xms20m -Xmx30m GCDemo
在上面的命令中,我们设置 JVM 的初始堆大小为 20M,最大堆空间为 30M。
年轻代
在 JDK1.8 中,堆分为年轻代和老年代。JVM 提供了参数 -Xmn 来设置年轻代内存的大小,但没有提供参数设置老年代的大小。但其实老年代的大小就等于堆大小减去年轻代大小。
java -Xms20m -Xmn10M GCDemo
上面的命令中,我们设置 JVM 堆初始大小为20M。其中年轻代的大小为 10M,那么剩下的就是老年代的大小,有 10M了。 我们可以给上述命令加上-XX:+PrintGCDetails 参数来查看内存区域的分配信息。
如上图所示,我们可以看到老年代的大小为 10M。
Eden区
在年轻代中,分为三个区域,分别是:eden 空间、from 空间、to 空间。如果要设置这部分的大小,那么就使用 -XX:Sur