Назад | Перейти на главную страницу

Может ли JVM (Oracle) столкнуться с ошибкой OutOfMemory, если размер кучи меньше максимального?

Я использую сайт Tomcat (с интерфейсом NGinx), которому кажется, что случайно не хватает памяти, хотя максимальный размер кучи довольно велик. Мой вопрос: может ли JVM получить ошибку OutOfMemory, даже если размер кучи значительно меньше -Xmx? Например, вот снимок, который я сделал всего за 15 секунд до ошибки OutOfMemory:

Вт, 18 декабря 23:13:28 JST 2012 Свободная память: 162,31 МБ Общий объем памяти: 727,75 МБ Максимальный объем памяти: 3808,00 МБ

Я предполагаю, что теоретически возможно, что мой код сгенерировал 3 гигабайта объектов за 15 секунд, но я очень сомневаюсь в этом. Похоже, что JVM не смогла увеличить кучу, хотя теоретически у нее было место .... Возможно ли, что другие процессы начали использовать память до такой степени, что JVM не могла расти? Я использую 64-битный Oracle Hotspot на 64-битной виртуальной машине с CentOS 5 с 6 гигабайтами оперативной памяти.

Соответствующая часть того, что вы опубликовали:

Свободная память: 162,31 МБ

Ваш код, вероятно, сгенерировал объекты на 162 МБ за 15 секунд.

Кроме того, вы говорите, что у вас есть «OutOfMemoryError», но не указываете «Недостаточное пространство кучи» как фактическую причину, по которой оно у вас возникло, так что да, вполне возможно, что другие процессы использовали память до того, как JVM смогла ее получить.

Вероятно, вы уже решили эту проблему, но для будущих поколений, которые могут наткнуться на этот вопрос, вы можете указать, какие настройки JVM находятся в вопросе. Возможно, слишком много памяти было зарезервировано для кучи, но недостаточно для других частей JVM или других серверных процессов, но мы бы просто гадали без этой информации.

В Java есть много разных пулов памяти, поэтому, даже если у вас достаточно размера кучи, у вас все равно может не хватить памяти. Вот отрывок из пары других настроек, которые я использовал на других сайтах Java, чтобы экспериментировать с ними самостоятельно. Я предлагаю вам также обратиться к документации по Java.

 .
 .
 .
 export JAVA_OPTS=" -XX:PermSize=32m -XX:MaxPermSize=512m ${JAVA_OPTS}"
 export JAVA_OPTS=" -XX:NewSize=4096m -XX:MaxNewSize=4096m -XX:SurvivorRatio=8 ${JAVA_OPTS}"
 .
 .
 .