Объем памяти процесса Java намного превышает указанные пределы

Я исследовал большинство доступных методов, чтобы выяснить, сколько памяти вообще использует Java-процесс. Пока я могу сказать, что знаю, что общая выделенная память может быть одним или несколькими из следующих:

Heap Memory (supposedly controlled by my -XX:MaxHeapSize=4096m) Permanent Memory (supposedly controlled by my -XX:MaxPermSize=1024m) Reserved Code Cache (supposedly controlled by my -XX:ReservedCodeCacheSize=256m) N of Threads * Thread Size (supposedly controlled by my -XX:ThreadStackSize=1024)

Но результаты слишком отличаются от того, что говорит мне linux, с любым из методов, которые я нашел доступными, чтобы получить потребление памяти процессом Java.

В моем случае это экземпляр Tomcat, работающий на машине с Ubuntu 11.10 x86_64, 64-битной JVM 1.6_u26 иps -ALcf | grep org.apache.catalina.startup.Bootstrap | wc -l говорит, что у меня запущено 145 потоков или процессов, связанных с одним корневым процессом (Tomcat).

Что все подведено должно дать мне полную максимальную память (4096 МБ) + (1024 МБ) + (256 МБ) + 145 * (1024 КБ) = 5521 МБ. Какиеjmap -heap PID говорит мне, чтоManagementFactory.memoryMXBean.(heapMemoryUsage + nonHeapMemoryUsage).getCommitted() говорит мне, и теоретическое значение выше все на пару.

Теперь о стороне Linux,top а такжеnmon оба говорят мне, что ResidentMemory выделяется этим процессом 5,8 ГБ - & gt; примерно 5939,2 МБ. Но я также знаю, что это только часть памяти, часть оперативной памяти. VIRT отtop и размер поnmon (оба должны представлять одно и то же) говорит мне, что процесс составляет 7530 МБ (или точно 7710952 КБ поnmon). This is TOO different from the expected maximum: 2009MB above the maximumи в соответствии с jmap и jstat распределение кучи памяти даже не достигло своего пика (2048-OldSpace + 1534-Eden _ + _ Survivors).

top также говорит мне, что размер стека кода составляет 36 КБ (честно, для начального каталитического стартера), а размер стека данных составляет 7,3 ГБ (что соответствует остальным).

Этот экземпляр tomcat-сервера является единственным, запущенным на этом компьютере, и он испытывает некоторую нестабильность. Требуется перезагрузка каждые три дня или около того, потому что на машине доступно 7647544 КБ ОЗУ, и нет подкачки (по соображениям производительности). Я выполнил математические расчеты для ограничений и, ожидая, что процесс последует за ними, я увидел, что это был довольно хороший запас безопасности для всех других служб, работающих на машине (ни одна из которых не должна беспокоить, кроме ssh и top): 7468 - 5521 = 1947. Это почти слишком много для «запаса прочности».

Итак, я хочу понять, откуда вся эта память используется и почему не соблюдается ограничение. Если какой-либо информации не хватает, я буду рад ее предоставить.

Ответы на вопрос(2)

Ваш ответ на вопрос