在JDK1.8开始有了元空间区(Matespace)来替换永久代(Permanent Generation),那么在设置JVM参数的时候,也要增加上Matespace的相关参数了。
在把JVM参数设置为:
-Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=80
但是程序启动运行之后发现
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
52416.0 52416.0 0.0 701.8 419456.0 404194.7 524288.0 161204.9 82560.0 79399.5 10112.0 9447.6 67 9.079 3 1.732 10.810
52416.0 52416.0 0.0 701.8 419456.0 404327.0 524288.0 161204.9 82560.0 79399.5 10112.0 9447.6 67 9.079 3 1.732 10.810
52416.0 52416.0 0.0 701.8 419456.0 404327.0 524288.0 161204.9 82560.0 79399.5 10112.0 9447.6 67 9.079 3 1.732 10.810
52416.0 52416.0 0.0 701.8 419456.0 404327.0 524288.0 161204.9 82560.0 79399.5 10112.0 9447.6 67 9.079 3 1.732 10.810
52416.0 52416.0 0.0 701.8 419456.0 404327.0 524288.0 161204.9 82560.0 79399.5 10112.0 9447.6 67 9.079 3 1.732 10.810
实际上Metespace的大小只有80.625m,和配置中的128m差距很大。是参数设置没有生效么?
其实不是的,MetaspaceSize 表示的并非是元空间的大小,它的含义是:主要控制matesaceGC发生的初始阈值,也就是最小阈值。也就是说当使用的matespace空间到达了MetaspaceSize的时候,就会触发Metaspace的GC。
MaxMetaspaceSize表示的是保证committed的内存不会超过这个值,一旦超过这个值就会触发GC。
注意:在jvm启动的时候,并不会分配MaxMetaspaceSize这么大的一块内存出来,metaspace是可以一直扩容的,直到到达MaxMetaspaceSize。