Автоматизация – Устранение неполадок OutOfMemoryError | Кодементор
Устранение неполадок OutOfMemoryError или любых проблем, связанных с памятью, выполняется вручную даже в 2019 году. Устранение неполадок и выявление основной причины OutOfMemoryError можно даже автоматизировать, выполнив следующие 3 шага:
1. Захватите дамп кучи
2. Перезапустите приложение
3. Диагностика проблем
Давайте подробно обсудим эти шаги.
(1). Захват дампа кучи
Дамп кучи — это, по сути, снимок памяти. Он содержит подробную информацию об объектах, которые присутствуют в памяти, фактические данные, которые присутствуют в этих объектах, ссылки, происходящие из этих объектов… Дамп кучи является жизненно важным артефактом для устранения проблем с памятью.
Чтобы диагностировать OutOfMemoryError или любую проблему, связанную с памятью, нужно было бы захватить дамп кучи прямо в данный момент или за несколько мгновений до того, как приложение начнет испытывать OutOfMemoryError. Захватить дамп кучи в нужный момент вручную сложно, потому что мы не будем знать, когда будет выброшен OutOfMemoryError. Однако сбор дампов кучи можно автоматизировать, передав следующие аргументы JVM при запуске приложения в командной строке:
-XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath={HEAP-DUMP-FILE-PATH}
Пример:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/crashes/my-heap-dump.hprof
В ‘-XX:HeapDumpPath’ вам нужно указать путь к файлу, в котором должен храниться дамп кучи.
Когда вы передаете эти два аргумента JVM, дампы кучи будут автоматически захвачены и записаны в указанный путь к файлу при возникновении ошибки OutOfMemoryError.
(2). Перезапустить приложение
В большинстве случаев OutOfMemoryError не приводит к сбою приложения. Однако лучше перезапустить приложение после того, как будет выброшен OutOfMemoryError. Потому что OutOfMemoryError потенциально может оставить приложение в нестабильном состоянии. Запросы, обслуживаемые из нестабильного экземпляра приложения, могут привести к ошибочному результату.
Вы также можете автоматизировать этот процесс перезапуска. Напишите сценарий «restart-myapp.sh», который корректно закроет и перезапустит ваше приложение. Теперь укажите путь к этому скрипту в аргументе JVM ‘-XX:OnOutOfMemoryError’.
Пример:
-XX:OnOutOfMemoryError=/scripts/restart-myapp.sh
Когда вы передаете этот аргумент, JVM будет вызывать сценарий «/scripts/restart-myapp.sh» всякий раз, когда выдается OutOfMemoryError. Таким образом, ваше приложение будет автоматически перезапущено сразу после возникновения ошибки OutOfMemoryError.
(3). Диагностика проблем
Теперь мы захватили дамп кучи (который необходим для устранения проблемы), перезапустили приложение (чтобы уменьшить влияние простоя). Следующий шаг – устранение неполадок. Это может быть немного сложно 😊, но может быть достигнуто с помощью правильных инструментов. Вы можете использовать такие инструменты, как Затмение MAT, HeapHero для анализа дампов кучи. Эти инструменты создают хороший отчет об анализе памяти, выделяя объекты, вызывающие утечку памяти. Однако большинство организаций делает этот шаг вручную.
Даже этот шаг можно автоматизировать, вызвав REST-API HeapHero. Этот API анализирует дамп кучи и возвращает отличный аналитический отчет. Вы можете вызвать этот API сразу после сценария «restart-myapp.sh». Таким образом, вы сможете автоматизировать устранение неполадок, связанных с OutOfMemoryError.
Удачного устранения неполадок.