JAVA8 元空间使用查看 JVM 参数 MetaspaceSize 和 MaxMetaspaceSize 的讲解
元空间使用情况查看
配置了-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m,通过 jstat -gcutil pid 查看 M 的值为 98.32,即 Meta 区使用率 达到了98.32%:
然后,再通过 jstat -gc 4210 2s 3 查看,结果如下图所示,计算 MU/MC 即 Meta 区的使用率确实达到了 98.32%,但是 MC,即 Metaspace Capacity 只有 55296k,并不是参数 MetaspaceSize 指定的 256m:
那么 -XX:MetaspaceSize=256m 的含义到底是什么呢?其实,这个 JVM 参数是指 Metaspace 扩容时 触发 FullGC 的初始化阈值,也是最小的阈值。这里有几个要点需要明确:
如果没有配置 -XX:MetaspaceSize,那么触发 FGC 的默认阈值是 21807104(约20.8m),可以通过 jinfo -flag MetaspaceSize pid 得到这个值;
如果配置了 -XX:MetaspaceSize,那么触发FGC的阈值就是配置的值;
Metaspace 会不断扩容到 -XX:MetaspaceSize 参数指定的量,每次 Metaspace 扩容都会发生 FGC;
如果 Old 区 配置 CMS 垃圾回收,那么扩容引起的 FGC 也会使用 CMS 算法进行回收;
如果 MaxMetaspaceSize 设置太小,可能会导致频繁FGC,甚至 OOM;
任何一个 JVM 参数的默认值可以通过 java -XX:+PrintFlagsFinal -version |grep JVMParamName 获取,例如:java -XX:+PrintFlagsFinal -version |grep MetaspaceSize
总结:关于 java7 和 java8 的比较:
在 java 8 中占用内存的大小只受本机总内存的限制。
JDK8+ 移除了 Perm,引入了 Metapsace,它们两者的区别是什么呢?
java8 中 Metasace 无论 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 两个参数如何设置,随着类加载越来越多会不断扩容调整,直到MetaspaceSize(如果没有配置就是默认20.8m)触发FGC,上限是-XX:MaxMetaspaceSize,默认是几乎无穷大。
java7 中的 Perm,我们通过配置 -XX:PermSize 以及 -XX:MaxPermSize 来控制这块内存的大小,jvm 在启动的时候会根据 -XX:PermSize 初始化分配一块连续的内存块,这样的话,如果 -XX:PermSize 设置过大,就是一种赤裸裸的浪费。很明显,Metapsace 比 Perm 好多了;
java8 建议
MetaspaceSize 和 MaxMetaspaceSize 设置一样大;
具体设置多大,建议稳定运行一段时间后通过 jstat -gc pid 确认且这个值大一些,对于大部分项目 256m 即可。
共 0 条评论