什么是元数据GC阈值以及如何调整它?

时间:2014-08-11 19:59:51

标签: java performance garbage-collection java-8

在应用程序中,我有以下-verbose:gc

[GC (Metadata GC Threshold)  8530310K->2065630K(31574016K), 0.3831399 secs]
[Full GC (Metadata GC Threshold)  2065630K->2053217K(31574016K), 3.5927870 secs]
[GC (Metadata GC Threshold)  8061486K->2076192K(31574016K), 0.0096316 secs]
[Full GC (Metadata GC Threshold)  2076192K->2055722K(31574016K), 0.9376524 secs]
[GC (Metadata GC Threshold)  8765230K->2100440K(31574016K), 0.0150190 secs]
[Full GC (Metadata GC Threshold)  2100440K->2077052K(31574016K), 4.1662779 secs]

这是什么"元数据GC阈值" 以及如何减少它。注意:虽然Full GC花了很长时间进行清理,但它实际上清理得很多,即如果没有这样做会更好。

2 个答案:

答案 0 :(得分:41)

日志消息告知GC是由 Metaspace 分配失败引起的。 Metaspaces 保存类元数据。他们在Java 8中have appeared替换 PermGen

Here are调整 Metaspaces 的一些选项 您可能需要设置以下一个或多个选项:

-XX:MetaspaceSize=100M设置分配的类元数据空间的大小,该空间将在第一次超出时触发垃圾回收;

-XX:InitialBootClassLoaderMetaspaceSize=32M增加引导类加载器Metaspace;

-XX:MinMetaspaceFreeRatio=50让Metaspaces变得更加积极;

-XX:MaxMetaspaceFreeRatio=80减少Metaspaces萎缩的可能性;

-XX:MinMetaspaceExpansion=4M扩展元空间的最小尺寸;

-XX:MaxMetaspaceExpansion=16M在没有Full GC的情况下扩展Metaspace的最大大小。

答案 1 :(得分:13)

虽然已有一个已接受的答案,但想提及还有:

  

-XX:MaxMetaspaceSize=<NNN> where <NNN>是为类元数据分配的最大空间量(以字节为单位)。

同样来自here

  

触发死类和类加载器的垃圾收集   一旦类元数据使用达到“MaxMetaspaceSize”。

有一个可用选项列表in this post