Java8使用能够动态扩展的元空间。当元空间满时,GC将在元空间上运行。这是否意味着GC永远不会在元空间上运行?
我的Java 8应用程序使用了大量内存。我想知道我的元空间在运行时的大小。我该怎么做?
我正在考虑设置MaxMetaspaceSize。我应该将它设置为什么?有什么建议吗?
发布于 2016-04-07 17:09:47
选项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根据感兴趣的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的大小调整。
[Metaspace: 34904K->34904K(1081344K)], 0.1408610 secs]包含相关信息:在GC之前和之后都使用了34,9mb。您可以找到的这些日志条目中的最新条目将显示当前大小(即GC之后)。
请记住,只要调整Metaspace的大小,就会运行完整的GC。因此,当您已经知道~21mb的默认值(取决于主机配置)还不够时,最好为此配置一个好的起始值。
有关调整元空间大小的详细信息,请参阅this。
发布于 2015-06-24 02:20:52
for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
if ("Metaspace".equals(memoryMXBean.getName())) {
System.out.println(memoryMXBean.getUsage().getUsed()/1024/1024 + " mb");
}
}是的,如果你认为监控和修复MaxMetaspaceSize有漏洞,最好设置它。
发布于 2017-04-14 06:00:51
使用jcmd。它是Java 8中最好的内置oracle工具,用来查找这些东西。
注意:您需要以启动java进程的任何用户的身份运行jcmd。如果您正在调试像Jetty这样的with服务器,您可能需要使用像sudo su jetty这样的东西来更改用户。
jcmd <pid> VM.native_memory 
这有
运行jcmd <pid> help获取更多选项的
https://stackoverflow.com/questions/31010463
复制相似问题