Сборка мусора в метапространстве Java 8

Java-процесс, который я запускаю, стабильно хорошо работает в течение первого часа или около того. Однако после этого производительность быстро падает. При профилировании я обнаружил, что сборка мусора в метапространстве происходила довольно часто до отметки часа, а затем вышла из-под контроля:

введите описание изображения здесь

Я почти уверен, что смогу исправить это, используя параметр -XX:MaxMetaspaceSize. Тем не менее, я хотел бы узнать больше о том, почему такое поведение может происходить. Я не могу себе представить, почему алгоритм сборки мусора будет вести себя так. У кого-нибудь есть объяснение или совет о лучшем исправлении? Спасибо


person user1675642    schedule 23.07.2015    source источник
comment
Я думаю, вы используете какую-то структуру, которая генерирует классы в RunTime. И в конце концов выходит из-под контроля. Решение зависит от используемого вами фреймворка.   -  person talex    schedule 23.07.2015
comment
Спасибо, и да, я. Это пришло мне в голову, но скорость, с которой генерируются классы, похоже, не меняется. Все, что, кажется, изменилось, это то, что частота gc уменьшилась.   -  person user1675642    schedule 23.07.2015
comment
Вероятно, это какая-то эвристика JVM. Это попытка найти лучшие параметры, такие как максимальный размер. Также это похоже на стробоскопический эффект. Размер метапространства, измеренный в какой-то конкретный момент времени. Когда частота GC примерно такая же, как частота измерения, могут возникнуть некоторые странные эффекты.   -  person talex    schedule 23.07.2015
comment
Когда вы говорите, что производительность ухудшается - каковы симптомы? И действительно ли вы связали метапространственный GC с этими симптомами?   -  person K Erlandsson    schedule 23.07.2015
comment
Симптомы в том, что процесс делает то, что он делает гораздо медленнее. Память, используемая процессом, также начинает увеличиваться. Изменение коррелирует с изменением, наблюдаемым на графике. Меня интересует объяснение приведенного выше графика, даже если он на самом деле не связан с моей проблемой производительности.   -  person user1675642    schedule 24.07.2015


Ответы (1)


Вы можете попробовать установить -XX:MaxMetaspaceExpansion=0. Это должно привести к полной сборке мусора — выпуску динамически созданных методов/данных класса — перед попыткой увеличить метапространство. Кроме того, вы можете попробовать установить MaxMetaspaceFreeRatio на более низкое значение, чем значение по умолчанию, чтобы уменьшить само метапространство после GC.

См. этот ответ для других параметров, связанных с метапространством.

Сама сборка метапространства зависит от классов, выгружаемых сборщиком мусора. Таким образом, в зависимости от GC, который вы используете, также может помочь более быстрая утилизация мусора.

person the8472    schedule 26.07.2015