Решение неустойчивой проблемы сборки мусора - Java - PullRequest
3 голосов
/ 06 июля 2011

У меня весеннее корпоративное приложение, работающее на JDK 1.6 под Windows 2008. Приложение работает медленно или не отвечает в случайные моменты времени. Я подозреваю, что это утечка памяти, и GC начинает работать.

Как устранить неполадки, не перезапуская JVM с помощью параметра java.exe -verbose: gc? Я действительно не могу закрыть это приложение. Я планирую сделать AppDynamics на нем, как только я смогу перезапустить его, но знаете, что я могу сделать? Какие у меня варианты?

1 Ответ

3 голосов
/ 06 июля 2011

Запустите приложение и запустите jconsole на PID. Пока он работает, посмотрите на кучу в консоли. Когда это близко к максимам, получайте свалку в кучу. Загрузите Eclipse MAT и проанализируйте дамп кучи. Если вы заметили, что размер оставшейся кучи значительно меньше, чем фактический двоичный файл, проанализируйте дамп кучи с установленным параметром -keep_unreachable_objects.

Если последнее верно и вы делаете полный сбор данных, часто у вас, вероятно, происходит какая-то утечка. Имейте в виду, что когда я говорю «утечка», я не имею в виду утечку, когда GC не может сохранить память, а скорее то, как вы строите большие объекты и делаете их недоступными достаточно часто, чтобы GC потреблял много процессорного времени.

Если бы вы видели истинные утечки памяти, вы бы увидели ошибки GC Overhead достигли

...