Что такое порог 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 метаданных" и как его уменьшить. Примечание: в то время как Full GC тратит много времени на очистку, он действительно сильно очищает, т.е. Было бы лучше, если бы он этого не делал.
Ответы
Ответ 1
В сообщении журнала сообщается, что GC был вызван сбоем распределения метаданных.
Metaspaces содержат метаданные класса. Они появились в Java 8, чтобы заменить PermGen.
Ниже приведены некоторые параметры настройки Metaspaces.
Вы можете установить один или несколько из следующих параметров:
-XX:MetaspaceSize=100M
Устанавливает размер выделенного пространства метаданных класса, которое будет запускать сборку мусора при первом превышении;
-XX:InitialBootClassLoaderMetaspaceSize=32M
, чтобы увеличить загрузчик загрузочного класса Metaspace;
-XX:MinMetaspaceFreeRatio=50
, чтобы сделать Metaspaces более агрессивно;
-XX:MaxMetaspaceFreeRatio=80
, чтобы уменьшить вероятность сокращения Metaspaces;
-XX:MinMetaspaceExpansion=4M
размер минимального размера, при котором метапроцесс не используется,
-XX:MaxMetaspaceExpansion=16M
максимальный размер, чтобы развернуть Metaspace без полного GC.
Ответ 2
Хотя уже есть принятый ответ, хотелось бы упомянуть, что есть также:
-XX:MaxMetaspaceSize=<NNN> where <NNN>
- это максимальный объем пространства для метаданных класса (в байтах).
Также из здесь,
Вызывается сбор мусора мертвых классов и загрузчиков классов как только использование метаданных класса достигнет "MaxMetaspaceSize".
В этом сообщении есть список доступных опций .