4年前 (2020-09-09)  爪哇岛 |   抢沙发  2465 
文章评分 0 次,平均分 0.0

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)

Java8如何在运行时找出元空间metaspace的大小

所以,在本例中,提交了大约181mb的元空间,而当前使用了137mb。

gc垃圾回收日志

Java8如何在运行时找出元空间metaspace的大小

如果您启用了垃圾收集日志,您也可以从中找到这一点,例如,在应用程序崩溃或报告问题之后。搜索以下行

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工具

相关阅读:https://javakk.com/378.html

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/384.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册