2015-07-23 1 views
5

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

enter image description here

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

+0

Я думаю, вы используете фреймворк, который генерирует классы в RunTime. И в итоге он выходит из-под контроля. Решение зависит от используемой вами структуры. – talex

+0

Спасибо, и да, я. Это произошло со мной, но скорость создания классов не меняется. Все, что, похоже, меняется, так это то, что частота gc уменьшается. – user1675642

+0

Это, вероятно, несколько эвристик JVM. Он пытается найти лучшие параметры, такие как максимальный размер. Также он выглядит как стробоскопический эффект. Размер измеряемой площади в определенный момент времени. Когда частота GC примерно такая же, как и частота измерения, могут возникать некоторые странные эффекты. – talex

ответ

3

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

См. this answer для других опций, связанных с метаобеспечением.

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