18

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

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

我正在考虑设置MaxMetaspaceSize。我应该把它设置成什么?有什么建议吗?

4

3 回答 3

21

选项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

根据这个感兴趣的是:

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 的默认值(取决于主机配置)是不够的时,最好为此配置一个好的起始值。

有关调整元空间大小的更多信息,请参阅此内容。

于 2016-04-07T09:09:46.643 回答
16
for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
    if ("Metaspace".equals(memoryMXBean.getName())) {
            System.out.println(memoryMXBean.getUsage().getUsed()/1024/1024 + " mb");
    }
}

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

于 2015-06-23T18:20:52.293 回答
3

使用 jcmd。它是在 Java 8 中查找这些东西的最佳内置 oracle 工具。从终端...

注意:您需要以启动 java 进程的任何用户身份运行 jcmd。如果您正在调试像 Jetty 这样的网络服务器,您可能需要使用类似sudo su jetty.

  1. jcmd
  2. 获取为您的应用显示的 PID 并运行jcmd <pid> VM.native_memory 在此处输入图像描述 This has
  3. 如需更多选项,请运行jcmd <pid> help
于 2017-04-13T22:00:50.997 回答