Вызывает ли JVM сборку мусора, когда она достигает своего предела -Xmx? - PullRequest
10 голосов
/ 21 февраля 2012

Вопрос в основном содержится в заголовке.

Скажем, у вас есть приложение, которое достигло предела JVM -Xmx.Когда этому приложению требуется больше памяти, принудительно ли производится сбор мусора?(в JVM HotSpot)

Вторая странная вещь, которую я не могу объяснить, это то, что у меня в настоящее время есть сервер приложений, который работает с -Xmx = 2048m, команда "top" (в linux) сообщает 2.7gдля его процесса.

Так как / когда приложению разрешено превышать его -Xmx?

Спасибо,

Ответы [ 7 ]

11 голосов
/ 21 февраля 2012

На самом деле нормальный сборщик мусора запускается, когда молодое поколение заполнено (не вся куча), а основной сборщик мусора запускается, когда в пространстве выживших не осталось места, поэтому некоторые объекты необходимо перенести в старое поколение.

7 голосов
/ 21 февраля 2012

Параметр Xmx указывает только размер кучи.Процесс Java занимает больше памяти, так как куча - это только одна часть процесса Java, я думаю, у вас есть и другие вещи, которые содержит процесс Java, такие как собственные библиотеки, perm gen, а также собственные выделения памяти, сделанные приложением.

Вот хорошая статья, описывающая распределение памяти: http://www.ibm.com/developerworks/java/library/j-nativememory-linux/

4 голосов
/ 21 февраля 2012

Да, JVM обязательно вызовет GC, если он достигнет предела кучи (и, вероятно, намного раньше).Если это не поможет, будет выброшено OutOfMemoryError s.

. Причина, по которой вы видите большее потребление памяти процессом, заключается в том, что опция -Xmx ограничивает только пространство кучи Java (где объекты Javaвыделяются на).Есть еще несколько областей памяти, используемых JVM дополнительно: пространство для стеков потоков, «PermGen» (где хранятся классы и их код), «прямая» память, выделенная через ByteBuffers, память, выделенная собственными библиотеками и т. Д.Для некоторых из этих дополнительных областей памяти существуют другие параметры конфигурации, которые позволяют ограничивать их, например -Xss, но некоторые даже не контролируются JVM.

3 голосов
/ 21 февраля 2012

Обычно это так, хотя GC обычно запускается гораздо раньше, в зависимости от используемого сборщика мусора.

1 голос
/ 21 февраля 2012

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

1 голос
/ 21 февраля 2012

Да, если вы все еще не нашли память, это вызовет ошибку OutOfmemory.Я так понимаю.

0 голосов
/ 21 февраля 2012

Сборка мусора - довольно большая область, но то, что вы говорите, подходит для полных сборок (есть и другие типы)

Следует помнить, что -Xmx устанавливает максимальный размер кучи, но есть также -Xms, который является минимальным размером кучи. Ваше приложение может запускаться только с минимально настроенным. Затем, если используемая память достигнет этого, он запустит полную сборку мусора И увеличит объем доступной кучи от минимального (-Xmx) до некоторого значения, меньшего или равного максимальному (-Xmx). Это может происходить несколько раз, пока не будет достигнут максимум. После этого он больше не может увеличивать кучу, но сбор мусора будет продолжаться, когда будет достигнут этот максимум.

...