文章评分
次,平均分 :
Java8使用能够动态扩展的元空间。GC将在metaspace满时运行。
- 这是否意味着GC永远不会在metaspace上运行呢?
- 我的Java8应用程序占用了大量内存。我想知道我的元空间在运行时的大小。我该怎么做?
- 我正在考虑设置MaxMetaspaceSize。我应该把它设置成什么?有什么建议吗?
jstat -gc PID
执行jvm指令
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。
gc垃圾回收日志
如果您启用了垃圾收集日志,您也可以从中找到这一点,例如,在应用程序崩溃或报告问题之后。搜索以下行
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(取决于主机配置)不够时,最好为此配置一个好的开始值。
MemoryPoolMXBean
for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
if ("Metaspace".equals(memoryMXBean.getName())) {
System.out.println(memoryMXBean.getUsage().getUsed()/1024/1024 + " mb");
}
}
通过代码的方式监控MaxMetaspaceSize是否泄漏并修复它。
还有一种方式就是使用jcmd。它是在Java8中查找这些内容的最好的内置oracle工具
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/384.html
暂无评论