Java: полный GC (полное постоянное поколение) происходит случайным образом

Я настроил для своего java-приложения следующие параметры -Xmx=46g, -Xms=46g, NewSize=2g.

Мы не настроили размер для permgen, но в JCONSOLE он показывает максимальный размер perm gen как 83 МБ.

При выполнении тестов стабильности мы могли видеть, что я случайно получаю следующее в журналах GC.

[Полный ГХ (полное поколение) 489.822: [CMS: 11384171K-> 4403070K (46137344K), 10.9407280 секунды] 11572765K-> 4403070K (48024832K), [CMS PERM: 37142K-> 37062K (37376K)], 10.9413340 секунды] [раз : user=10,80 sys=0,13, real=10,94 с]

Я не смог найти причину этого вызова GC, так как есть свободное место для постоянной генерации (поскольку 83 МБ отображается как максимальное значение, а выделенная память perm gen отображается как около 37 МБ).

Не могли бы вы поделиться своими мыслями о том же?

Спасибо, Дж.К.


person JK_007    schedule 23.05.2015    source источник


Ответы (1)


Несмотря на то, что ваш max PermGen может составлять 83 МБ, JVM выделила только 36,5 МБ в точке журнала выше. Кажется справедливым предположить, что JVM выполняет полный сборщик мусора и пытается продолжить работу с тем, что выпущено, прежде чем запросить у ОС больше памяти для расширения своего пространства PermGen (максимум до 83 МБ).

Вы можете попробовать установить начальный размер PermGen с помощью -XX:PermSize.

person Mattias Jiderhamn    schedule 24.05.2015
comment
Привет, спасибо за ответ. Если используемый размер permgen достигает зафиксированного размера perm gen, JVM выполняет полный gc ?. Я думал, что JVM автоматически увеличит выделенный размер perm gen, не выполняя полный gc (поскольку уже доступно достаточно места до 83 МБ). - person JK_007; 24.05.2015
comment
@ JK_007 JVM действительно (к сожалению) потребуется полный сборщик мусора для роста perm gen. - person K Erlandsson; 24.05.2015
comment
Спасибо .. Как было предложено, я буду использовать опцию -XX:PermSize и -XX:MaxPermSize и установить то же самое, что и 83 МБ. - person JK_007; 24.05.2015