2012-02-21 9 views
10

Вопрос в основном содержится в названии.Собирает ли сборщик мусора JVM, когда он достигает предела -Xmx?

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

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

Итак, как и когда приложение может превышать его -Xmx?

Спасибо,

+1

'-Xmx = 2048' составляет 2048 байт. Я предполагаю, что вы имеете в виду '-Xmx = 2048m' Примечание: вы можете написать только' -mx2g', что то же самое. –

+0

@PeterLawrey Спасибо, да, я имел в виду 2048 м. Отредактировал вопрос. – Simeon

ответ

11

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

+2

+1: Обычно заполненное пространство - это то, что запускает Full GC. Незначительные собрания обычно избегают заполнения пространства для оставшихся в живых, перемещая объекты в пространство для хранения до этого. –

+2

«-Xmx» устанавливает максимальный размер кучи. Это часто самая большая область, но не единственная область. У вас есть потоковые стеки, прямая память, общие библиотеки, сам JVM и т. Д. –

1

Да, если вы до сих пор не нашли памяти будет поднять OutOfMemory Error. Я так понимаю.

3

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

1

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

3

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

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

0

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

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

7

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

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

Смежные вопросы