Согласно Запуск gc в памяти Metaspace в java 8 , полный GC необходим для того, чтобы уменьшить использование metaspace.
Насколько я понимаю, метапространство не является сборщиком мусора само по себе . Вместо этого у вас есть объекты в обычной куче, которые содержат специальные ссылки на объекты метапространства. Когда обычные объекты собраны, соответствующие объекты метапространства освобождаются.
Когда он достигнет этой первой высшей отметки, не должен ли он в следующий раз увеличиться до максимального размера?
Видимо, нет. Обычная стратегия для сборщиков HotSpot выглядит следующим образом:
- выделяйте объекты, пока не достигнете текущего предела кучи
- запустить коллектор
- посмотрите, сколько места было освобождено, и увеличьте (или уменьшите) размер кучи, если это оправдано.
Кажется, здесь используется та же стратегия. И полный сборщик мусора заставляет достаточное количество метапространства для восстановления, что он решает, что ему не нужно расширять метапространство.
В качестве помощи для этого можно попробовать установить для -XX:MetaspaceSize
и -XX:MaxMetaspaceSize
одинаковое значение, но это только сделает полные GC менее частыми.
Реальным решением было бы выяснить, что потребляет метапространство, и исправить его.