Как процесс Java с -Xmx1024m может занимать 3GB резидентной памяти? - PullRequest
5 голосов
/ 26 марта 2009

Это веб-приложение Java на Websphere6.1, Solaris 10, JDK 1.5.0_13. Мы устанавливаем максимальный размер кучи до 1024м. jmap показывает, что состояние кучи исправно. Использование кучи памяти составляет всего 57%. Нет OutOfMemory вообще.

Но мы увидели очень высокий RSS (3 ГБ) для этого процесса Java от PS. pmap показывает блок частной памяти 1.9G.

3785:   /dmwdkpmmkg/was/610/java/bin/java -server -Dwas.status.socket=65370 -X
 Address  Kbytes     RSS    Anon  Locked Pgsz Mode   Mapped File
...
0020A000    2008    2008    2008       -   8K rwx--    [ heap ]
00400000 1957888 1957888 1957888       -   4M rwx--    [ heap ]
8D076000      40      40      40       -   8K rw--R    [ stack tid=10786 ]
...

Это утечка памяти кучи C в нативном коде? Какой подход рекомендуется выяснить первопричину?

Ответы [ 4 ]

4 голосов
/ 26 марта 2009

Это Устранение неполадок, связанных с утечками памяти * Документ 1002 * от Sun может помочь вам найти причину проблемы с высоким RSS, особенно в разделе 3.4.

Поскольку вы работаете с Websphere, возможно, вы можете использовать -memeorycheck на вашей виртуальной машине. Подробнее см. здесь .

Это не обязательно утечка в нативном коде. Если вы посмотрите здесь , в Solaris может возникнуть проблема с открытыми файлами.

Это просто набор ссылок и подсказок, но, возможно, полезно отследить вашу проблему.

3 голосов
/ 21 апреля 2015

Это может произойти, даже если нет утечки памяти (например, незакрытых zip-ресурсов).

Я столкнулся с той же проблемой. Это известная проблема с glibc> = 2.10

Лечение заключается в том, чтобы установить эту переменную env export MALLOC_ARENA_MAX=4

Статья IBM о настройке MALLOC_ARENA_MAX https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en

Google для MALLOC_ARENA_MAX или найдите его в SO, чтобы найти много ссылок.

Возможно, вы захотите настроить и другие параметры malloc для оптимизации низкой фрагментации выделенной памяти:

# tune glibc memory allocation, optimize for low fragmentation
# limit the number of arenas
# requires glibc >= 2.16 since there was a bug in 
# MALLOC_ARENA_TEST parameter handling that cause MALLOC_ARENA_MAX not to work
export MALLOC_ARENA_MAX=2
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt"
export MALLOC_MMAP_THRESHOLD_=131072
export MALLOC_TRIM_THRESHOLD_=131072
export MALLOC_TOP_PAD_=131072
export MALLOC_MMAP_MAX_=65536

Вы можете вызвать встроенную функцию malloc_info для получения информации о распределении памяти. Вот пример использования JNA для вызова собственного метода malloc_info .

2 голосов
/ 26 марта 2009

Размер кучи или размер кучи Java, все еще есть VM и другие библиотеки, которые являются частью процесса.

Попробуйте запустить Hello World с размером кучи 1024 м и «for (;;)» и посмотрите, сколько это займет. Это должно дать вам основу для общего использования памяти.

1 голос
/ 26 марта 2009

Вы используете библиотеки JNI? Я не уверен, как нативный код распределяет ОЗУ, но именно здесь я бы начал искать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...