Подтвердить что ты не робот

Использование JVM Process vs Использование памяти JVM

Я прочитал эту Process Memory Vs Heap - JVM  и у меня такая же проблема.

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Фактическое потребление памяти больше, чем то, что вы установили с помощью Xmx и т.д., что нормально. "java будет выделять память для других вещей, включая стек для каждого потока. Необычно, что общее потребление памяти VM превысит значение -Xmx."

Ответ 3

Парамеры -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().

Ответ 4

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

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

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

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

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