Проблема java OutOfMemory - дамп кучи на 800 МБ меньше настроенной максимальной кучи

У меня есть веб-приложение, развернутое в Oracle App Server 10.1.3, в oc4j, запущенном с начальной кучей 1 ГБ и максимальной кучей 2 ГБ, на RHEL на 32-разрядной версии, настроенной на просмотр 32 ГБ ОЗУ. В последнее время я столкнулся с ошибками OutOfMemory, поэтому я настроил приложение для создания дампов кучи на OutOfMem. Итак, у меня есть 4-5 дампов кучи, каждый размером не более 1,2 Гб (то есть на 800 Мб меньше максимального размера кучи). Кроме того, выполнение свободного на машине в среднем часов показывает около 20 ГБ свободной оперативной памяти.

Значит ли это, что приложение пытается выделить 800 Мб за один раз? Или если есть 2 или более потока, которые пытаются выделить память одновременно, они оба терпят неудачу, даже если, скажем, есть память для каждого, но не для суммы обоих? Может ли быть пб с линуксовой машиной, может она не может отдать память на джаву? Может быть, память фрагментирована, может быть, конфигурация, позволяющая 32-битной машине видеть 32 Гб оперативной памяти, имеет пб?

(Должен отметить, что приложение в последнее время не менялось, но на этой машине недавно был развернут новый oc4j и новое приложение, которое съедает 1-2 г оперативной памяти)


person Laurentiu    schedule 18.03.2011    source источник
comment
согласно ответу Сураджа, если perm gen занимает больше места, то у вас есть сильная ссылка на объекты. Можете ли вы опубликовать дамп кучи.   -  person Dead Programmer    schedule 18.03.2011


Ответы (2)


На большинстве 32-битных машин (включая большинство разновидностей Linux) максимальная память, которую может выделить ваш процесс, составляет около 2G. Теперь, если вы говорите, что ваша куча занимает 1,2 ГБ, то в худшем случае я предполагаю, что ваш постоянный генератор съедает остальные >800M. Попробуйте установить -XX:MaxPermSize=200M и проверьте.

person Suraj Chandran    schedule 18.03.2011
comment
Хм... Это очень интересно... У меня пермген 512 Мб. 32-битная машина может видеть 32 Гб ОЗУ - я думаю, она настроена с PAE. В таком случае может ли процесс получить больше 2 Гб оперативной памяти? - person Laurentiu; 18.03.2011
comment
Я собираюсь протестировать с Max perm gen 256 M и посмотреть, что произойдет. Большое спасибо. - person Laurentiu; 18.03.2011
comment
@Laurentiu да, это дало бы вам лучшую картину. - person Suraj Chandran; 18.03.2011

Я думаю, ваша проблема в том, что вы выделяете размер кучи 1G-2G для всего сервера приложений. Он потребляет некоторую память сам по себе, не уверен, сколько. Но если вы запустите сервер приложений с максимальным объемом памяти 2 ГБ, у вас будет определенно меньше 2 ГБ для вашего веб-приложения.

person Jan Zyka    schedule 18.03.2011