Назад | Перейти на главную страницу

Почему мой процесс Java использует гораздо больше места в куче, чем указано?

Я запускаю приложение Java в Solaris с помощью переключателя -Xmx256M. Когда я подключаюсь через JMX, JVM сообщает мне, что приложение использует около 50 МБ кучи, и правильно указывает, что максимальный размер кучи составляет около 250 МБ.

Однако Solaris рассказывает мне совсем другую историю. Например, при запуске pmap я получаю:

 ~ > pmap -S 10124 | grep heap

0002C000    3920    3920 rwx--    [ heap ]
00400000  815104  815104 rwx--    [ heap ]

Показаны невероятные 800 МБ памяти, используемые для кучи.

ps подтверждает использование памяти:

ps -eo vsz,rss,pid,args | sort -n

939368 925576 10124 /apps/../java -Xmx256M xxxx

я прочел https://plumbr.eu/blog/why-does-my-java-process-consume-more-memory-than-xmx, но в статье описывается JVM, использующая память, отличную от кучи (т.е. стек, собственные библиотеки и потоки), но в моем случае JVM на самом деле использует гораздо больше куча чем указано.

Моя версия Java:

java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) Server VM (build 20.6-b01, mixed mode)

Чтобы добавить к загадочности, у меня есть другие приложения Java, работающие на том же самом компьютере, используя ту же самую JVM с теми же настройками, которые ведут себя прекрасно. Что делает это приложение "особенным", так это то, что оно подключается к внешнему стороннему приложению (RET LBN, если это помогает). Он не запускает JNI или собственный код - так почему же сторонняя библиотека не соблюдает параметры запуска JVM?

Я в своем уме - любая помощь или указатели будут очень благодарны.

Куча Java - это блок памяти, в котором хранятся объекты Java.

«pmap» показывает кучу процесса операционной системы. Это память, используемая для запуска java-процесса. Сюда входит весь код Java, а также весь код C, составляющий среду выполнения Java.

Чтобы показать кучу java, попробуйте вкладку «Память» в jconsole или jmap или jstat.