Процесс JVM против использования памяти кучи JVM - PullRequest
18 голосов
/ 22 июля 2011

Я прочитал это Память процесса против кучи - JVM , и у меня та же проблема.

Использование памяти процессом jvm постоянно увеличивается и никогда не уменьшается. Я проверял это, работая на сервере linux.Приложение планирует задания в кластер (используя Quartz + API Java Java DRMAA)

Пространство кучи Java остается в пределах в течение жизненного цикла приложения, но процесс jvm демонстрирует устойчивый рост использования памяти иникогда не спускается

Это утечка памяти?Если так, то почему пространство кучи находится в пределах?Может кто-нибудь объяснить это.

ОБНОВЛЕНИЕ: У меня -Xmx1600m -Xms1600m, когда я отслеживаю через jconsole, я могу видеть пространство кучи в пределах этого предела около 450 м, но команда top показывает, что процессиспользуя более 900 м.

Ответы [ 4 ]

11 голосов
/ 22 июля 2011

Общая используемая виртуальная память является суммой максимальной кучи + стеков потоков + прямой памяти + perm gen + разделяемых библиотек. Это никогда не сжимается.

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

JVM никогда не освобождает память для ОС, однако, если основная память не используется в течение длительного времени, ее можно заменить, если это необходимо.

2 голосов
/ 22 июля 2011

Фактическое потребление памяти превышает то, что вы установили с помощью Xmx и т. Д., Это нормально.«Java будет выделять память для других вещей, включая стек для каждого потока. Обычно потребление памяти виртуальной машиной превышает значение -Xmx.»

1 голос
/ 31 июля 2012

Параметры -Xmx1600m -Xms1600m предписывают JVM выделить 1600 МБ памяти как минимум и 1600 МБ памяти максимум.Поэтому JVM должна выделять 1600 МБ при запуске и никогда не освобождать его.

Если вы хотите, чтобы JVM освободила память обратно в ОС, тогда значение -Xms должно быть низким, и вам, вероятно, придется использовать Java 1.7с новым сборщиком мусора G1.stefankrause.net/wp/?p=14.

При использовании Mac OS X 10.8 и Java 1.7 с -Xms32m -Xmx256m -XX: + UseG1GC -XX: MinHeapFreeRatio = 5 -XX: MaxHeapFreeRatio = 10 память возвращается в ОС после System.gc () выполняется.

0 голосов
/ 24 января 2013

В куче виртуальная машина Java (JVM) хранит все объекты, созданные приложением Java, например, с помощью «нового» оператора. Java сборщик мусора (gc) может логически разделить кучу на разные области, так что gc может быстрее идентифицировать объекты, которые могут быть удалены

Память для новых объектов выделяется в куче во время выполнения. Переменные экземпляра живут внутри объекта, в котором они объявлены.

Стек - это место, где хранятся вызовы методов и локальные переменные. Если метод вызывается, то его кадр стека помещается на вершину стека вызовов. Фрейм стека содержит состояние метода, включая то, какая строка кода выполняется, и значения всех локальных переменных. Метод в верхней части стека всегда является текущим рабочим методом для этого стека. Потоки имеют свой собственный стек вызовов.

Как уже говорилось ранее, в Java объекты создаются в куче. Язык программирования не позволяет программисту решать, должны ли объекты генерироваться в стеке. Но в некоторых случаях было бы желательно выделить объект в стеке, так как выделение памяти в стеке дешевле, чем выделение памяти в куче, освобождение в стеке свободно, и стек эффективно управляется средой выполнения.

Поэтому JVM использует внутренний экранированный анализ, чтобы проверить, используется ли объект только с потоком или методом. Если JVM идентифицирует это, она может принять решение создать объект в стеке, что повысит производительность программы Java. (http://www.ibm.com/developerworks/java/library/j-nativememory-linux/)

...