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

Pet*_*rey 34 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]
Run Code Online (Sandbox Code Playgroud)

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

apa*_*gin 45

日志消息告知GC是由Metaspace分配失败引起的. 元空间包含类元数据.它们已经出现在Java 8中以取代PermGen.

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

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

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

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

-XX:MaxMetaspaceFreeRatio=80 减少Metaspaces萎缩的机会;

-XX:MinMetaspaceExpansion=4M 扩展Metaspace的最小尺寸;

-XX:MaxMetaspaceExpansion=16M 没有Full GC扩展Metaspace的最大大小.

  • JDK8 中的 Metasapce 在 64 位虚拟机上默认设置为 21MB。对于高性能应用程序,您可能需要考虑将 min,init 设置为 max(就像使用 JDK7 中的 PermGen 一样)并限制高水位线大小比率 Metaspace Full GC 的开销很大,因为它们也运行 Old Heap Full GC,因此并从提高的 GC 暂停时间增加到总应用程序 p95、p99 运行时延迟。-XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -XX:MinMetaspaceFreeRatio=0 -XX:MaxMetaspaceFreeRatio=100 (3认同)
  • +1增加了“ MetaspaceSize”的作用。 (2认同)

Rav*_* HV 13

虽然已经有一个公认的答案,但想提一下,还有:

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

也是从这里,

一旦类元数据使用达到"MaxMetaspaceSize",就会触发死类和类加载器的垃圾收集.

此帖子中有可用选项列表 .

  • 这比接受的答案更准确地回答了这个问题。 (2认同)