Java 8 如何在运行时查找Metaspace大小

19

Java 8使用能够动态扩展的元空间(metaspace)。当元空间(metaspace)变得充满时,GC将运行在元空间(metaspace)上。那么这是否意味着GC永远不会在元空间(metaspace)上运行?

我的Java 8应用程序占用了大量内存。我想知道运行时metaspace的大小是多少。我该如何做到这一点?

我正在考虑设置MaxMetaspaceSize。我应该将其设置为什么值?有什么建议吗?

3个回答

25

选项 1:

执行

jstat -gc PID

(使用要监控的JVM的PID替换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

根据这篇文章,我们感兴趣的内容是:

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(取决于主机配置)不足够时,建议配置一个良好的起始值。

有关调整Metaspace大小的详细信息,请参见此处


3
man jstat可以正确解释"MC: Metaspace capacity (kB)"和"MU: Metacspace utilization (kB)"的含义,而不是"committed"和"used"。 - moxn

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

如果您认为监视和修复可能导致泄漏,那么设置MaxMetaspaceSize是更好的选择。


3
使用jcmd。它是Java 8中最好的内置Oracle工具,可用于查找这些内容。从终端运行...
注意:您需要将jcmd作为启动Java进程的任何用户运行。如果您正在调试像Jetty这样的Web服务器,则可能需要使用类似sudo su jetty的内容更改用户。
1.运行jcmd 2.获取应用程序显示的PID并运行jcmd <pid> VM.native_memoryenter image description here 这有 3.要获得更多选项,请运行jcmd <pid> help

需要打开NMT。 - eckes
3
使用命令jcmd <pid> GC.heap_info可以获取有关Metaspace大小的基本信息,而且不需要启用NMT。 - Juraj Martinka
你知道 heap_info 是在什么时候添加的吗?在 8 u25 中没有这个功能。 - Chris DaMour
jinfo -flag MaxMetaspaceSize <pid> 这个命令也不需要NMT。 - Jarek Przygódzki
1
@Chris_GC.heap_info_在jdk9-b94中被添加,详见JDK-8059036jdk/commit/3b63ebf830734aab17c085f86fde4b1bed26c0a4 - Jarek Przygódzki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接