2015-02-24 2 views
0

Мое приложение бросает java.lang.OutOfMemoryError: GC overhead limit exceeded Ошибка. Я обыскал его и получил достаточно информации. Oracle говорит:ставка между gc распределение кучи и моя java-программа

Причина: Подробное сообщение «Превышение предельного уровня GC» указывает, что сборщик мусора работает все время, и программа Java делает очень медленный прогресс. После сбора мусора, если процесс Java тратит более 98% времени на сборку мусора, и если он восстанавливает менее 2% кучи и до сих пор делает последние 5 (постоянная времени компиляции) последовательного мусора коллекции, затем вызывается java.lang.OutOfMemoryError. Это исключение обычно выбрасывается из-за того, что количество живых данных едва вписывается в кучу Java, у которой мало свободного места для новых распределений. Действие: Увеличьте размер кучи. Исключение java.lang.OutOfMemoryError для превышения верхнего предела GC может быть отключено с помощью флаг командной строки -XX: -UseGCOverheadLimit.

Мой вопрос: как я могу отслеживать кучу, выделенную GC, и моей программой java. Я попробовал jstat -gcutil, но у него недостаточно информации. Есть ли инструмент, который я могу видеть скорость между моим распределением кучи java-программы за GC распределением кучи? Спасибо за консультацию.

+1

jconsole или коммерческие профайлы, например. jprofiler –

ответ

2

Обратите внимание, что это не «java heap» и «gc heap allocation», а процессорное время, выделенное для фактической программы и времени процессора, предназначенного для GC. Исключение выбрасывается, когда большая часть времени проводится в сборщике мусора.

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

При работе с этими проблемами я предпочитаю использовать jvisualvm, который поставляется с Oracle JDK и предоставляет графическую информацию в реальном времени.

Последние JVM предоставляют более подробную информацию, чем предыдущие, но также используют разные алгоритмы GC, которые могут изменять наблюдаемые результаты.

+0

Должен ли я использовать набор результатов для моих операций db? У меня есть 7 миллионов записей для выбора и insert.i уже используют 8 потоков. – mft

+0

, и когда я отслеживаю с помощью visualvm, распределение размера кучи начинается с макс. 486 мб. моя программа все еще работает и размер кучи теперь составляет около 516 мб. это не будет увеличиваться. он сокращается. любые комментарии по этому поводу? было бы полезно – mft

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