Java Heap Space - Как работает -Xmx? - PullRequest
       29

Java Heap Space - Как работает -Xmx?

8 голосов
/ 24 августа 2011

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

Я добавил параметр JVM -XX: + HeapDumpOnOutOfMemoryError , который создает дамп кучи при возникновении ошибки OutOfMemory. Затем я проанализировал файл дампа, созданный различными инструментами профилирования. Затем я начал играть с параметром -Xmx и шаблонами наблюдений.

Что меня озадачило, так это следующее. Почему при анализе дампа я обнаружил, что общий размер всех объектов был намного меньше, чем тот, который я установил с помощью параметра -Xmx? Например, скажем, я установил -Xmx на «2048m». Когда я проанализировал файл дампа, я обнаружил в куче 400 МБ объектов. Я ожидал найти 2 ГБ. Я что-то пропустил?

Ответы [ 2 ]

5 голосов
/ 24 августа 2011

Я предполагаю, что, поскольку современные GC разделяют кучу на отдельные области памяти (молодое / постоянное / постоянное поколение), достаточно для того, чтобы пространство постоянного поколения полностью заполнилось, чтобы произошла ошибка нехватки памяти. Вы можете настроить соотношение различных пространств генерации, используя различные параметры командной строки JVM.

Вот хорошая статья о Настройка сборки мусора с помощью виртуальной машины Java [tm] 5.0 (я не смог найти более новую, но я думаю, что основы все еще применяются в более новых виртуальных машинах).

3 голосов
/ 24 августа 2011

Перечитайте ваше сообщение об ошибке - оно может сказать вам, какой тип памяти у вас закончился.Я предполагаю, что это было пространство PermGen.Permgen используется для определения классов (среди прочего).Вы можете настроить пространство для PermGen с помощью -XX: MaxPermSize PermGen не является частью кучи, поэтому не включается в дамп кучи.

См. этот ответ для получения дополнительной информации о просмотре PermGen.

Если это не проблема, попробуйте установить начальный размер кучи (-Xms) натак же, как максимум.Это означает, что куча не будет расти, что должно облегчить понимание того, что происходит.

Я рекомендую использовать jvisualvm (часть JDK), чтобы посмотреть на использование вашей памяти во время работы вашей программы.

...