Почему время GC неуклонно увеличивается в долго работающем Java-приложении большого объема? - PullRequest
8 голосов
/ 09 сентября 2010

У меня большое Java-приложение, которое обрабатывает постоянную нагрузку в 50000msgs / сек. Он настроен на высокую пропускную способность с использованием следующих настроек:

-Xmx3g -Xms3g -XX: NewSize = 2g -Xss128k -XX: SurvivorRatio = 6 -XX: TargetSurvivorRatio = 90 -XX: + ИспользоватьParallelGC -XX: ParallelGCThreads = 12 -XX: + ИспользоватьParallelOemOapOllOhall -Old-MGGC *

Я обнаружил, что время молодого GC постоянно приближается к 50 мс, когда оно начинается к 200 мс к концу дня, хотя частота GC остается неизменной

Если я попытаюсь сделать то же самое, используя сборщик ParNewGC, время GC будет расти гораздо быстрее. У кого-нибудь есть мысли по этой проблеме?

Ответы [ 2 ]

3 голосов
/ 09 сентября 2010

Если у вас есть утечка памяти или кэш в памяти, который постепенно использует все больше и больше памяти, это приведет к тому, что ГХ выполнит больше работы по отслеживанию достижимых объектов.

ДругоеВозможные варианты:

  • У вас есть утечка памяти без кучи, что приводит к увеличению подкачки;т.е. копирование страниц физической памяти на диск и обратно.

  • Некоторые внешние процессы потребляют все большие объемы памяти, что приводит к увеличению объема страниц.

  • Природа объектов, генерируемых молодым поколением, со временем меняется, поэтому для отслеживания достижимых объектов требуется больше работы.Может просто случиться так, что большая часть из них выживет после первой коллекции.

2 голосов
/ 09 сентября 2010

Это может быть сочетание нескольких факторов:

  • Настоящая утечка памяти. (Объекты все еще упоминаются случайно)
  • Больше объектов или, возможно, другое распределение объектов между пулами gc.
  • куча больше. Составьте график времени и размера кучи.
  • Фрагментация памяти. На уровне ОС и / или кучи Java, в зависимости от jvm.

Почему бы вам не нарисовать количество объектов, размер кучи и время компоновки. (используя инструмент или запрашивая MBeans) График должен сообщать вам тенденцию; увеличивается, уменьшается или линейный, и поможет вам определить, есть ли утечка. Если возможно, также выведите некоторую статистику из вашей программы, например количество обработанных сообщений или активных сеансов и т. Д.

Это реальная проблема, поскольку ваши сообщения не обрабатываются во время gc ?. Попробуйте одновременную отметку и разверните gc ...

* -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
...