Java GC неоднозначное логирование - PullRequest
4 голосов
/ 21 марта 2011

Я запускаю Java-клиент с Java JRE на 32-битных окнах, с

java -Xmx1024m -Xms1024m -verbose:gc -XX:+PrintGCDetails -jar myJar.jar

Мой jar содержит много данных (таблицы двойников, 600ish MB), которые остаются в памяти на протяжении всей жизни приложения.

Затем выдает сообщения о каждой минуте, в которых говорится:

[GC [DefNew: 279616K-> 279616K (314560K), 0,0002037 секунд] [Срок владения: 595827K-> 599952K (699072K), 1,1020398 секунд] 875443K-> 599952K (1013632K), [1013632K], [ 10042K-> 10042K (16384K)], 1,1030218 с] [Время: пользователь = 1,09 сис = 0,01, реальное = 1,11 с]

и я действительно не понимаю смелую часть. Он говорит, что новое поколение идет от 279616K до 279616K (то есть ничего не изменилось), старое поколение немного увеличилось (595827K-> 599952K), но в целом оно говорит 875443K-> 599952K, то есть сокращение ~ 30%. Как это может быть?

edit: чтобы быть совершенно ясным, я ожидал, что если я добавлю 279616K + 595827K = 875443K, я получу первую часть, выделенную жирным шрифтом, то есть общий размер кучи. Точно так же я ожидал, что 279616K + 599952K будет означать вторую часть жирным шрифтом, но это не так. В ссылке Сообщения журнала сбора мусора Java , указанной ниже, она добавляет , поэтому я, вероятно, что-то упускаю.

Ответы [ 2 ]

3 голосов
/ 21 марта 2011

Дело в том, что DefNew и Tenured являются результатами небольших коллекций, в то время как общие цифры также включают результат следующей основной коллекции. Таким образом, молодое поколение не может быть успешно собрано во время второстепенной коллекции, а собирается только основной коллекцией.

Диагностика проблемы сбора мусора предполагает, что это может быть вызвано слишком большим молодым поколением:

[GC [DefNew: 16000K-> 16000K (16192K), 0,0000498 секунд] [Срок владения: 2535K-> 2319K (16384K), 0,0860925 секунд] 18535K-> 2319K (32576K), 0,0863350 секунд]

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

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

1 голос
/ 21 марта 2011

Нужно поискать немного больше в SO, прежде чем спрашивать. В любом случае, посмотрите на это:

Сообщения журнала сбора мусора Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...