Повторный полный GC с доступной кучей

Я испытываю повторяющиеся полные сборщики мусора, даже когда куча не используется полностью.

Вот как выглядят журналы gc: http://d.pr/i/iFug ( синяя линия — используемая куча, а серые прямоугольники — полные сборщики мусора).

Кажется, это проблема, аналогичная той, что указана в этом вопросе: Частый полный GC с пустым куча

Однако эта ветка не дала реальных ответов на проблему. В моем приложении используется RMI, а рабочие серверы действительно используют версию 1.6 до обновления 45, которое увеличило интервалы сборки мусора с 1 минуты до 1 часа (http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/relnotes.html). Однако из остальной части журнала я не вижу шаблона Full-GC-every-1-min.

Что может быть причиной этого?


person halfwarp    schedule 26.09.2013    source источник


Ответы (2)


Скорее всего, причина в том, что вы достигли текущего размера кучи. Размер кучи меньше установленного вами максимума и корректируется по ходу работы программы.

например Скажем, вы установили максимум 1 ГБ, начальный размер кучи может быть 256 МБ, и когда вы достигнете 256 МБ, он выполнит полный GC, после этого GC может решить, что 400 МБ будет лучшим размером, и когда это будет достигнуто выполняется полный GC и т. д.


Вы получаете большую коллекцию, когда постоянное пространство заполняется или не может найти свободное место. Например, если он фрагментирован.

Вы также получаете полные коллекции, если ваши места для выживших слишком малы.

Короче говоря, наиболее вероятной причиной являются используемые вами параметры настройки gc. Я предлагаю вам упростить параметры настройки до тех пор, пока ваша система не будет вести себя так, как вы ожидаете.

person Peter Lawrey    schedule 26.09.2013
comment
Я запускаю JVM с одинаковой минимальной и максимальной кучей, так что это не может быть так. Я бы хотел попробовать настроить GC, но, к сожалению, это произошло в производственной среде, и я могу воспроизвести это в тестовой среде. - person halfwarp; 27.09.2013

Как указано в связанной ветке, отключите явный GC и посмотрите, не появится ли снова шаблон FullGC: -XX:+DisableExplicitGC. Код RMI может запускать явный GC в заданном интервале, что в некоторых случаях может быть нежелательным.

Если FullGC по-прежнему возникают, я бы взял дампы потоков и, возможно, дамп кучи для анализа проблемы.

Кроме того, используйте jstat, чтобы увидеть занятость пространств Eden, Survivor, OldGen.

person Aleš    schedule 26.09.2013
comment
Это может сработать, но каковы будут побочные эффекты? Я бы хотел воспроизвести это в тестовой среде, но не могу. - person halfwarp; 27.09.2013
comment
Не должно быть никаких побочных эффектов, не рекомендуется вызывать System.gc() — это может снизить производительность, поэтому рекомендуется использовать только -XX:+DisableExplicitGC и позволить сборщику мусора сделать всю работу. Вы в основном используете этот флаг как защиту от мошеннических библиотек/кода, который пытается вызвать явный сборщик мусора. - person Aleš; 27.09.2013