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

在应用程序中,我有以下内容-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阈值”是什么,我如何降低它。注意:虽然完整的GC花费了很长时间来清理,但它实际上并没有清理太多,也就是说,如果它不这样做会更好。


答案 1

日志消息告诉 GC 是由元空间分配失败引起的。元空间保存类元数据。它们出现在Java 8中以取代PermGen

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

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

-XX:InitialBootClassLoaderMetaspaceSize=32M增加引导类装入器元空间;

-XX:MinMetaspaceFreeRatio=50使元空间增长得更加激烈;

-XX:MaxMetaspaceFreeRatio=80减少元空间缩小的机会;

-XX:MinMetaspaceExpansion=4M元空间被计算出来的最小大小;

-XX:MaxMetaspaceExpansion=16M在没有完整GC的情况下扩展元空间的最大大小。


答案 2

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

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

从这里开始,

一旦类元数据使用率达到“MaxMetaspaceSize”,就会触发死类和类装入器的垃圾回收。

这篇文章中有一个可用选项列表。


推荐