Я запускаю приложение 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.