JVM Conf для нормального GC при высокой нагрузке - PullRequest
2 голосов
/ 07 апреля 2011

У меня есть серверное приложение на базе Netty. Он декодирует сообщение (из json) и отправляет его обратно клиенту (простое эхо). Когда у меня много сообщений, отправленных с одного клиента (более 15 Кб / с), сборщик мусора не запускается, и использование памяти увеличивается.

Как я могу настроить jvm для уменьшения пауз gc и уменьшения использования памяти?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Ваше описание звучит как утечка памяти.В конце концов запускается ли сборщик мусора, или вы получаете OutOfMemoryError?

Если вы этого не сделаете, то похоже, что вы попадаете в ситуацию, когда объекты живут достаточно долго, чтобы попасть вштатное поколение (я предполагаю, что Sun JVM здесь).И решение этой проблемы состоит в том, чтобы увеличить размер молодого поколения по сравнению с постоянным поколением.

Вот ссылка, которая объясняет сборщик поколений Sun JVM (это для 1.5 JVM, но я считаю, что варианты еще нетне изменился для 1.6): http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

Варианты, с которыми вы хотели бы поэкспериментировать: NewRatio, то есть отношение между молодым и постоянным поколением, и SurvivorRatio, который является соотношениеммежду Эдемом и двумя местами выживших.Я мог бы попробовать следующее:

  • -XX:NewRatio=1 дает молодому поколению половину кучи объектов
  • -XX:SurvivorRatio=2 делает каждое пространство выживших вдвое меньше, чем в Эдеме

Эти две настройки заставят пространство "Eden" для новых объектов занимать 1/4 кучи.Это довольно большой, так что, надеюсь, большинство объектов проведут всю свою жизнь в Эдеме.Рацион выживших дает еще 1/4 кучи пространствам для выживших (по 1/8 для каждого), чтобы удерживать объекты со средней продолжительностью жизни.

Конечно, не устанавливайте параметры вслепую.Вместо этого используйте jconsole (часть дистрибутива JDK), чтобы увидеть, что на самом деле происходит с вашей кучей.Вы можете обнаружить, что коэффициент выживания по умолчанию (1: 6) лучше, чем я предлагал.

0 голосов
/ 17 октября 2012

Чтобы настроить jvm для уменьшения пауз gc и уменьшения использования памяти, вам нужно выбрать подходящий сборщик GC.CMS - это коллектор с низкой паузой.Вы можете установить -XX: + UseConcMarkSweepGC, чтобы включить его.И вы можете точно настроить другие параметры, такие как

-XX: + UseCMSInitiatingOccupancyOnly-XX: CMSInitiatingOccupancyFraction = пп

для контроля паузы ГХ.

...