Java 8使用能够动态扩展的元空间。 GC满时将在元空间上运行。这是否意味着GC将永远不会在元空间上运行?
我的Java 8应用程序正在使用很多内存。我想知道运行时我的元空间的大小。我怎么做?
我正在考虑设置MaxMetaspaceSize
。我应该设置为什么?有什么建议吗?
最佳答案
选项1:
执行
jstat -gc PID
(将PID替换为要监视的JVM的PID),它将返回sth。喜欢:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
103936.0 107008.0 0.0 41618.3 820736.0 401794.3 444928.0 183545.7 181888.0 137262.8 28544.0 20386.6 313 16.024 8 3.706 19.729
根据this感兴趣的是:
MC: Metaspace capacity (kB)
MU: Metaspace utilization (kB)
因此,在这种情况下,提交了约181mb的元空间,而当前使用了137mb。
选项2:
如果您启用了垃圾收集日志,则也可以从那里找到它,例如应用程序已经崩溃或报告了问题之后。
搜索类似的行
2016-04-06T01:50:04.842+0200: 7.795: [Full GC (Metadata GC Threshold)
[PSYoungGen: 7139K->0K(177152K)]
[ParOldGen: 18396K->22213K(101888K)] 25535K->22213K(279040K),
[Metaspace: 34904K->34904K(1081344K)], 0.1408610 secs]
[Times: user=0.45 sys=0.00, real=0.14 secs]
当达到先前的阈值时,这构成了元空间的大小调整。
[Metaspace: 34904K->34904K(1081344K)], 0.1408610 secs]
包含相关信息:GC之前和之后分别使用了34.9mb。
您可以找到的最新这些日志条目将显示当前大小(即:GC之后)。
请记住,只要调整Metaspace的大小,就会运行完整的GC。因此,当您已经知道〜21mb的默认值(取决于主机配置)还不够时,为此配置一个好的起始值是个好主意。
有关调整元空间大小的更多信息,请参见this。