在应用程序中,我有以下-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花了很长时间进行清理,但它实际上清理得很多,即如果没有这样做会更好。
答案 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。