2015-12-17 5 views
4

** Что java.lang.OutOfMemoryError: Java куча пространства означает ** Этот mesasge означает, что приложение просто требует большего пространства кучи Java, чем доступно для него, чтобы нормально работать.java.lang.OutOfMemoryError Ограниченный верхний предел GC превышен против пространства кучи Java?

Что java.lang.OutOfMemoryError ГК накладные расходы за предел средства Это сообщение означает, что по какой-то причине сборщик мусора принимает чрезмерное количество времени (по умолчанию 98% всего процессорного времени процесса) и восстанавливает очень мало памяти в каждом прогоне (по умолчанию 2% от кучи). Это внутренне также означает, что когда приложение просто требует большего пространства кучи Java, чем доступно для него, чтобы нормально работать.

Так что мой вопрос в том, какой сценарий из двух выше будет тригером?

Так вот мое понимание, когда определенное исключение будет выброшено на основе сценария: -

Say я выделил 1 Гб размера кучи. В настоящее время используется куча памяти 970 МБ. Начался поток (JVM не знает заранее, сколько памяти он будет потреблять). Теперь ОЕ может принимать одно из приведенной ниже стадии

1) виртуальная машина Java начинается выделение памяти, а затем в один момент времени он исчерпывает 1 Гб MEM и бросает `java.lang.OutOfMemoryError: Java куча пространство означает

2) GC запускается заранее и пытается освободить некоторую память, поскольку она знает, что в настоящее время используется память, близка к 1 ГБ, выделенной Heap. Но его не удалось освободить более 2% пространства в каждом последующем запуске . Тогда это будет throw java.lang.OutOfMemoryError: превышен верхний предел GC`

Я понимаю, что это правильно в контексте моего вопроса?

+0

Да ..Ur понимание совершенно выставляю. – SubbaReddy

ответ

1

OutOfMemoryError: Java heap space

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

OutOfMemoryError GC overhead limit exceeded

Означает, что виртуальная машина может быть в состоянии удовлетворить запрос на выделение, но в недавнем прошлом он должен GC так часто, что количество процессорного времени тратится на GCing превысил (конфигурируемый) часть общего процессорного времени используемый java-процессом.

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

Зачастую отключение GC Ohead накладных расходов приведет к тому, что через несколько минут произойдет простое пространство памяти Java.

Это, в основном, быстрый механизм.

+0

JVM не «самозакрывается» на OOM. JVM будет завершаться только в том случае, если OOM приведет к завершению последнего потока не-демона (обычная механика выхода все еще применяется). –

+0

Правильно, я использую '-XX: OnOutOfMemoryError = 'kill -9% p'' для этого эффекта, поскольку исключение в любом месте, такое как OOM, может оставить ваш процесс в неопределенном состоянии – the8472

0
java.lang.OutOfMemoryError: Java heap space 

Причина: объект не может быть выделен в куче Java. Эта ошибка не обязательно подразумевает утечку памяти. Проблема может быть такой же простой, как проблема с конфигурацией, где указанный размер кучи (или размер по умолчанию, если он не указан) недостаточен для приложения.

java.lang.OutOfMemoryError: GC Overhead limit exceeded 

Как вы указали, сбор мусора занимает слишком много времени. Это может быть побочным эффектом утечки памяти в вашем приложении.Старый ген может быть полностью заполнен из-за утечки, и, следовательно, GC не выпускает (или очень меньше) цикл сбора мусора.

Посмотрите на этот оракул article для устранения неполадок утечки памяти.

Что касается ваших двух запросов, я также считаю, что ваше понимание правильное, за исключением разницы. Событие запуска GC во втором случае - это не просто создание нового объекта. Полный GC будет срабатывать при определенном условии. Посмотрите на этот вопрос SE.

Смежные вопросы