JVM предоставила полезные аргументы для работы с OutOfMemoryError . В этой статье мы хотели бы выделить эти аргументы JVM. Это может пригодиться вам при устранении неполадок OutOfMemoryError. Эти аргументы JVM:
- -XX: + HeapDumpOnOutOfMemoryError -XX: HeapDumpPath
- -XX: OnOutOfMemoryError
- -XX: + ExitOnOutOfMemoryError
- -XX: + CrashOnOutOfMemoryError
Давайте обсудим эти аргументы JVM подробно в этой статье.
(1). XX: + HeapDumpOnOutOfMemoryError -XX: HeapDumpPath
Дамп кучи — это в основном снимок памяти. Он содержит подробную информацию об объектах, которые присутствуют в памяти, фактические данные, которые присутствуют в этих объектах, ссылки на происхождение этих объектов. Дамп кучи является жизненно важным артефактом для устранения проблем с памятью.
Чтобы диагностировать OutOfMemoryError или любую проблему, связанную с памятью, нужно было бы захватить дамп кучи прямо сейчас или за несколько секунд до того, как приложение начнет испытывать OutOfMemoryError. Трудно сделать дамп кучи в нужный момент вручную, потому что мы не будем знать, когда будет выдан OutOfMemoryError. Однако захват дампов кучи может быть автоматизирован путем передачи следующих аргументов JVM при запуске приложения в командной строке:
| 1 | -XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath={HEAP-DUMP-FILE-PATH} | 
Пример:
| 1 | -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/crashes/my-heap-dump.hprof | 
В ‘-XX: HeapDumpPath’ вам нужно указать путь к файлу, где должен храниться дамп кучи.
Когда вы передаете эти два аргумента JVM, дампы кучи будут автоматически записываться и записываться в указанный путь к файлу, когда выбрасывается OutOfMemoryError.
После захвата дампов кучи вы можете использовать такие инструменты, как HeapHero , Eclipse MAT, для анализа дампов кучи.
(2). -XX: OnOutOfMemoryError
Вы можете настроить JVM для вызова любого скрипта, когда выбрасывается OutOfMemoryError. В большинстве случаев OutOfMemoryError не приводит к сбою приложения. Тем не менее, лучше перезапустить приложение, как только OutOfMemoryError произойдет. Потому что OutOfMemoryError потенциально может оставить приложение в нестабильном состоянии. Запросы, обслуживаемые нестабильным экземпляром приложения, могут привести к ошибочному результату.
Пример:
| 1 | -XX:OnOutOfMemoryError=/scripts/restart-myapp.sh | 
Когда вы передаете этот аргумент, JVM будет вызывать скрипт «/scripts/restart-myapp.sh» всякий раз, когда генерируется OutOfMemoryError. В этом сценарии вы можете написать код для корректного перезапуска приложения.
(3) .XX + CrashOnOutOfMemoryError
Когда вы передадите этот аргумент, JVM выйдет сразу, когда будет выдан OutOfMemoryError. Помимо выхода, JVM создает текстовые и двоичные файлы сбоев (если включены основные файлы). Но лично я не предпочел бы настроить этот аргумент, потому что мы всегда должны стремиться к изящному выходу. Резкий выход может поставить под угрозу транзакции, которые находятся в движении.
Я запустил приложение, которое генерирует OutOfMemoryError с этим аргументом ‘-XX: + CrashOnOutOfMemoryError’. Я мог видеть, что JVM завершает работу сразу же, когда генерируется OutOfMemoryError Ниже было сообщение в стандартном потоке вывода:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | Aborting due to java.lang.OutOfMemoryError: GC overhead limit exceeded## A fatal error has been detected by the Java Runtime Environment:##  Internal Error (debug.cpp:308), pid=26064, tid=0x0000000000004f4c#  fatal error: OutOfMemory encountered: GC overhead limit exceeded## JRE version: Java(TM) SE Runtime Environment (8.0_181-b13) (build 1.8.0_181-b13)# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode windows-amd64 compressed oops)# Failed to write core dump. Minidumps are not enabled by defaulton client versions of Windows## An error report file with more information is saved as:# C:workspacetier1app-svntrunkbuggyapphs_err_pid26064.log## If you would like to submit a bug report, please visit:#   http://bugreport.java.com/bugreport/crash.jsp# | 
Из сообщения вы можете увидеть файл hs_err_pid, который будет сгенерирован в «C: workspacetier1app-svntrunkbuggyapphs_err_pid26064.log». Файл hs_err_pid содержит информацию о сбое. Вы можете использовать такие инструменты, как fastThread, для анализа файла hs_err_pid. Но в большинстве случаев информация, представленная в hs_err_pid, очень проста. Этого недостаточно для устранения неполадок OutOfMemoryError.
(4). -XX: + ExitOnOutOfMemoryError
Когда вы передадите этот аргумент, JVM выйдет прямо при возникновении OutOfMemoryError. Вы можете передать этот аргумент, если хотите закрыть приложение. Но лично я не предпочел бы настроить этот аргумент, потому что мы всегда должны стремиться к изящному выходу. Резкий выход может поставить под угрозу транзакции, которые находятся в движении.
Я запустил ту же программу утечки памяти с этим аргументом JVM «XX: + ExitOnOutOfMemoryError». В отличие от ‘-XX: + CrashOnOutOfMemoryError’, этот аргумент JVM не создавал текстовый / двоичный файл. JVM только что вышел.
| Смотрите оригинальную статью здесь: OutOfMemoryError связанные аргументы JVM Мнения, высказанные участниками Java Code Geeks, являются их собственными. |