java 8在运行时查找metaspace的大小

时间:2015-06-23 18:17:13

标签: java java-8 metaspace

Java 8使用能够动态扩展的元空间。 GC将在满足空间运行时运行。这是否意味着GC永远不会在元空间上运行?

我的Java 8应用程序正在使用大量内存。我想知道运行时我的元空间大小是多少。我该怎么做?

我正在考虑设置MaxMetaspaceSize。我该怎么做呢?有什么建议吗?

3 个答案:

答案 0 :(得分:12)

选项1:

执行

jstat -gc PID

(将PID替换为要监视的JVM的PID)将返回......像:

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的Metaspace被提交,而目前使用的是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

答案 1 :(得分:10)

for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
    if ("Metaspace".equals(memoryMXBean.getName())) {
            System.out.println(memoryMXBean.getUsage().getUsed()/1024/1024 + " mb");
    }
}

是的,最好设置MaxMetaspaceSize,如果你认为它是漏洞来监控和修复它。

答案 2 :(得分:1)

使用jcmd。它是用于在Java 8中查找此内容的最佳内置oracle工具。从终端...

注意:无论用户启动java进程,都需要运行jcmd。如果您正在调试像Jetty这样的Web服务器,则可能需要使用sudo su jetty等内容来更改用户。

  1. 运行jcmd
  2. 获取为您的应用显示的PID并运行jcmd <pid> VM.native_memory enter image description here
  3. 有关更多选项,请运行jcmd <pid> help