Я пытаюсь определить лучший подход к решению этой проблемы, а не просто -XX:-UseGCOverheadLimit
, но мне нужно лучше понять проблему, которую я решаю.
Ну, вы используете слишком много памяти - и, судя по всему, это из-за медленной утечки памяти.
Вы можете попробовать увеличить размер кучи с помощью -Xmx
, что может помочь, если это не утечка памяти, а признак того, что вашему приложению действительно требуется много кучи, а значение, которое у вас есть в данный момент, немного ниже. Если это утечка памяти, это просто отложит неизбежное.
Чтобы выяснить, является ли это утечкой памяти, попросите виртуальную машину выгрузить кучу на OOM с помощью переключателя -XX:+HeapDumpOnOutOfMemoryError
, а затем проанализируйте дамп кучи, чтобы увидеть, существует ли больше объектов какого-либо типа, чем должно быть. http://blogs.oracle.com/alanb/entry/heap_dumps_are_back_with - неплохое место для старта.
Редактировать: Как бы то ни было, судьба сама столкнулась с этой проблемой через день после того, как этот вопрос был задан, в пакетном приложении. Это не было вызвано утечкой памяти, и увеличение размера кучи также не помогло. На самом деле я уменьшил размер кучи (с 1 ГБ до 256 МБ), чтобы ускорить полный сборщик мусора (хотя и несколько чаще). YMMV, но оно того стоит.
Редактировать 2: Не все проблемы решаются с помощью кучи меньшего размера ... следующим шагом было включение G1 сборщика мусора , который, кажется, работает лучше, чем CMS.