2014-12-12 3 views
4

Я разрабатываю приложение java swing для Windows 8.1 64 бит с 4 ГБ оперативной памяти с JDK версия 8u20 64bit.Большая разница между размером процесса JVM и размером кучи памяти

Проблема возникает, когда я запустил приложение с Профилиров Netbeans с опцией монитора.

Когда первый JFrame загружается приложение динамической памяти составляет около 18Mb и размер процесса виртуальной машины Java вокруг 50mb (image1).

Затем, когда я запускаю другой JFrame, который содержит JFxPanel с WebView Куча перескакивает к 45MB и proccess JVM перескакивает к 700mb очень быстро (IMAGE2) что очень сбивает с толку. Затем, когда я закрываю второй JFrame и вызывается и вызывается System.gc(), а JVM выполняет GC (в большинстве случаев), куча падает до 20mb, но JVM-процесс никогда не падает (image3).

Почему существует огромная разница между кучей памяти (45 Мб) и JVM-процессом (699 Мб)? Зачем JVM нужна вся эта память? И как уменьшить эту сумму? И я запускает приложение с этими опциями Vm:

-Xms10m -Xmx60m -Xss192k 
-XX:+UseG1GC -XX:MinHeapFreeRatio=5 
-XX:MaxHeapFreeRatio=10 -XX:PermSize=20m 
-XX:MaxPermSize=32m 

EDIT: - я только что прочитал вопрос в этой связи JVM memory usage out of control и он имеет ту же проблему, но ситуация изменилась его размер кучи Arround 33 % от общего объема памяти процесса JVM, который в моем случае меньше 7%, и он выполняет несколько заданий одновременно (Tomcat webapp), которые я не выполняю (приложение java swing), и он не запускал свое приложение с той же VM аргументы я сделал.

ОБНОВЛЕНИЕ: - после первого фрейму запускается (image1)

First JFrame launched

после второго фрейму запускается (image2)

Second JFrame launch

после второй JFrame (image3)

Second JFrame closed

EDIT 2: - Я просто попытался те же приложения с теми же аргументами VM выше и добавил

-client 
-XX:+UseCompressedOops 

и использовали JDK 8u25 32-битную, потому что, как указано в этом ответе https://stackoverflow.com/a/15471505/4231826 64-разрядная версия не включает клиентскую папку в JRE и игнорирует аргумент -client.

Результатом является то, что весь процесс памяти подскочил до 540МБ, когда второй фрейм был открыт, и размерами кучи (в трех точках) были почти те же номера, что и в 64-битной версии, ли это подтверждает что это проблема, связанная с JVM (одинаковые размеры кучи и разница в суммарном размере процесса) 260Mb?

+0

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

+0

Ни один из решений проблемы не состоял в том, чтобы остановить одновременные задания и запускать каждый из них по отдельности, что является проблемой для его кода, но я пересмотрел свой код, и это просто приложение с двумя Jframes, и это похоже на проблему, связанную с JVM, если только есть кое-что, что мне не хватает. – Waxren

+0

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

ответ

3

Распределение виртуальной памяти в основном не имеет значения (см. Пояснение this answer) и очень отличается от фактического использования памяти. JVM не предназначен для ограничения распределения виртуальной памяти, см. Вопрос о limiting virtual memory usage.
Конечный пользователь может видеть много использования виртуальной памяти в диспетчере задач, но это в основном бессмысленно. Различные номера для использования памяти, указанные в диспетчере задач Windows, описаны в this article. Вкратце: в диспетчере задач Windows смотрите «Память (частный рабочий набор)» и «Дельта ошибки страницы» (релевантность последнего объясняется в this answer).

+0

Спасибо за отличный ответ. Это объясняет многое: «JVM не предназначен для ограничения распределения виртуальной памяти». – Waxren

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