Что может привести к тому, что процесс java значительно превысит лимит Xmx или Xss?

У меня есть 7 разных java-демонов, которые я запускаю (все 7) на 3 разных серверах. Командная строка java имеет -Xmx2048m и -Xss1024k. На этих 3 серверах все 21 процесс показывает чуть менее 2,5 ГБ для размера VIRT сверху и сверху. Размер RES варьируется от 300 до 1,9 ГБ, в зависимости от того, какой демон это.

Это все, что должно быть.

Введите новый сервер. Более быстрый процессор, больше оперативной памяти (16 ГБ вместо 8 ГБ), немного более новая версия java (1.6.0_10-b33 на старых серверах, 1.6.0_31-b04 на новом сервере). Обе системы (и JVM) имеют 64 бит.

Перемещено 2 из демонов на новый сервер. На новом сервере, учитывая ту же задачу, демоны потребляют гораздо больше ЦП (примерно на одном уровне) и получают меньше. (Перемещено от 5110 процессоров на старых системах до 5620 с на новом).

Довольно много дополнительного ядра использования процессора (поток GC) и отчет 5 ГБ VIRT и 2 ГБ ВИЭ для одного демона и 10,5 ГБ VIRT и 2 ГБ RES для другого демона.

Любые идеи, из-за которых java игнорирует (или, как представляется, игнорировать, если это так) пределы памяти?

Ответ 1

Оказывается, это проблема glibc.

Короткий ответ для меня был:

экспорт MALLOC_ARENA_MAX = 1

Это уменьшило площадь обработки (VIRT в верхней части) на целых 5 раз. Вернемся к уровням, наблюдаемым в CentOS 5.

В последних версиях glibc появилась новая функция "пулы памяти для потоков":

http://www.centos.org/docs/5/html/5.4/Technical_Notes/glibc.html

Последний элемент в разделе журнала 1.71.1 обсуждает его (и ссылается на непубличную ошибку....)