java 8 在运行时找出元空间的大小
Java 8 使用能够动态扩展的元空间。GC 将在元空间满时在元空间上运行。这是否意味着GC永远不会在元空间上运行?
我的 Java 8 应用程序正在使用大量内存。我想知道运行时我的元空间的大小是多少。我该怎么做?
我正在考虑设置.我应该将其设置为什么?有什么建议吗?MaxMetaspaceSize
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
根据这个感兴趣的是:
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之后)。
请记住,每当调整元空间大小时,都会运行完整的 GC。因此,当您已经知道~21mb的默认值(取决于主机配置)不够时,最好为此配置一个好的起始值。
有关调整元空间大小的更多信息,请参阅此处。
for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
if ("Metaspace".equals(memoryMXBean.getName())) {
System.out.println(memoryMXBean.getUsage().getUsed()/1024/1024 + " mb");
}
}
是的,如果您认为监视和修复它很漏,最好设置它。MaxMetaspaceSize