Размер кучи Java не используется полностью - PullRequest
16 голосов
/ 04 мая 2011

В настоящее время я отслеживаю запущенное Java-приложение с Visual VM: http://visualvm.java.net/

Я подчеркиваю использование памяти с -Xmx128m.

При запуске я вижу размер кучиувеличение до 128 м (как и ожидалось), однако использованная куча сходится примерно до 105 м, прежде чем я столкнусь с ошибкой пространства кучи Java.

enter image description here

Почему эти оставшиеся 20 м не используются?

Ответы [ 3 ]

5 голосов
/ 04 мая 2011

Вам необходимо понять главный факт об эргономике сборщика мусора:

Дорогостоящей частью сборки мусора является поиск и работа с объектами, которые НЕ являются мусором.

Это означает, что когда куча приближается к своей максимальной емкости, сборщик мусора будет тратить все больше и больше времени на все меньше и меньше возврата в освобожденном пространстве. Если GC попытается использовать каждый последний байт памяти, результатом будет то, что ваша JVM будет тратить все больше и больше времени на сбор мусора, пока ... в конце концов ... практически не будет сделано никакой полезной работы.

Чтобы избежать этой патологической ситуации, JVM следит за соотношением времени, затраченного на сбор и выполнение полезной работы. Когда отношение превышает настраиваемое пороговое значение, ГХ поднимает OutOfMemoryError ... даже при том, что (технически) имеется свободная память. Это, вероятно, то, что вы видите, хотя другие объяснения в равной степени правдоподобны.

Вы можете изменить пороги GC, размеры генерации и т. Д. С помощью параметров JVM, но, вероятно, лучше этого не делать. Лучшая идея - выяснить, почему использование памяти вашим приложением постоянно увеличивается. Наиболее вероятные утечки памяти ... то есть ошибки ... в вашем коде, которые вызывают это. Потратьте свои усилия на поиск и исправление этих ошибок, не беспокоясь о том, почему вы не используете всю память.

(На самом деле, вы используете его ... но не всегда.)

4 голосов
/ 04 мая 2011

Куча разделена на Молодое Поколение (Пространство Эдема и два Пространства Выжившего одинакового размера, обычно называемые От и До), Старое Поколение (Постоянное) и Постоянное пространство.

Опция Xmx/Xms устанавливает общий размер кучи .Таким образом, область (с размером по умолчанию) на самом деле является постоянным пространством - и, возможно, мы не знаем подробностей о вашем стресс-тесте, никакие объекты фактически не перемещаются из eden в постоянное или постоянное состояние, поэтому эти области остаются пустыми, пока Eden заканчиваетсяпространства.

4 голосов
/ 04 мая 2011

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

...