• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

JAVA8 元空间使用查看 JVM 参数 MetaspaceSize 和 MaxMetaspaceSize 的讲解

元空间使用情况查看

配置了-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m,通过   jstat -gcutil pid 查看 M 的值 98.32,即 Meta 区使用率 达到了98.32%:

image.png

然后,再通过  jstat -gc 4210 2s 3  查看,结果如下图所示,计算 MU/MCMeta 区的使用率确实达到了 98.32%,但是 MC,即 Metaspace Capacity 只有 55296k,并不是参数 MetaspaceSize 指定的 256m:

image.png

那么  -XX:MetaspaceSize=256m 含义到底是什么呢?其实,这个 JVM 参数是指 Metaspace 扩容时 触发 FullGC 的初始化阈值,也是最小的阈值。这里有几个要点需要明确:

  1. 如果没有配置 -XX:MetaspaceSize,那么触发 FGC 的默认阈值是 21807104(约20.8m),可以通过 jinfo -flag MetaspaceSize pid 得到这个值;

  2. 如果配置了 -XX:MetaspaceSize,那么触发FGC的阈值就是配置的值;

  3. 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
0
下一篇:jstat --- JVM的统计监测工具 java gc 内存使用 故障排查

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。