Поведение кучи памяти - PullRequest
       1

Поведение кучи памяти

6 голосов
/ 15 октября 2010

У меня всегда был вопрос о поведении кучи памяти.

Профилируя мое приложение, я получаю приведенный выше график. Вроде все нормально. Но чего я не понимаю, почему во время GC куча немного увеличивается, даже если памяти достаточно (красный круг).

Что означает для долго работающего приложения, что оно когда-нибудь исчерпает пространство кучи?

alt text

Ответы [ 2 ]

6 голосов
/ 15 октября 2010

Не обязательно. Сборщик мусора может использовать до максимально выделенной кучи любым удобным для него способом. Экстраполяция будущего поведения GC на основе текущего поведения (но с другими условиями памяти) никоим образом не гарантирует точности.

Это имеет неприятный побочный эффект: очень трудно определить, будет ли возникать ошибка OutOfMemoryError, если только это не произойдет. Законный (но, вероятно, довольно неэффективный) сборщик мусора может просто ничего не делать до тех пор, пока не будет достигнут максимальный уровень памяти, а затем сделать метку остановки мира и развернуть всю кучу. С этой реализацией вы увидите, что ваша память постоянно увеличивается, и может возникнуть соблазн сказать, что OOME неизбежен, но вы просто не можете сказать .

При таких небольших размерах кучи увеличение здесь, скорее всего, связано только с ведением учета / выравниванием размера кэша / и т. Д. Вы говорите о менее чем 50 КБ или около того, глядя на разрешение в масштабе, так что я не должен беспокоиться.

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

4 голосов
/ 15 октября 2010

Сборщики мусора в HotSpot решают увеличить общий размер кучи сразу после завершения полного GC, если отношение свободного пространства к общему размеру кучи падает ниже определенного порога.Это соотношение можно настроить, используя один из многих параметров -XX для сборщика (ов) мусора.

Глядя на график памяти, вы увидите, что увеличение размера кучи происходит в «точках пилы»;т.е. локальные максимумы.Каждый из них соответствует запуску полного GC.Если вы внимательно посмотрите на «точки», где расширяется куча, вы увидите, что в каждом случае объем свободного пространства, следующего сразу за полным сборщиком мусора, немного выше, чем предыдущая такая «точка».

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

(Другая возможность состоит в том, что ваше приложение имеет медленную утечку памяти.)

Это означает для долго работающего приложениячто он когда-нибудь исчерпает пространство кучи?

Нет.Предполагая, что использование памяти вашим приложением (т. Е. Интеграл пространства, занимаемого достижимыми объектами) является циклическим, размер кучи приблизится к фиксированному верхнему пределу и никогда не превысит его.Конечно, OOME не являются неизбежными.

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