Каков наилучший способ отладки java.lang.OutOfMemoryError
исключений?
OutOfMemoryError
описывает тип ошибки в описании сообщения. Вы должны проверить описание сообщения об ошибке, чтобы обработать исключение.
Существуют различные первопричины исключений нехватки памяти. Обратитесь к документации оракула стр. для получения более подробной информации.
java.lang.OutOfMemoryError: Java heap space
:
Причина : подробное сообщение пространства кучи Java указывает, что объект не может быть выделен в куче Java.
java.lang.OutOfMemoryError: GC Overhead limit exceeded
Причина: Подробное сообщение «Превышен лимит накладных расходов GC» указывает на то, что сборщик мусора работает все время, а Java-программа работает очень медленно
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
Причина : подробное сообщение «Запрошенный размер массива превышает ограничение виртуальной машины» указывает, что приложение (или API, используемые этим приложением) пыталось выделить массив, размер которого больше размера кучи.
java.lang.OutOfMemoryError: Metaspace
Причина: Метаданные класса Java (внутреннее представление класса Java для виртуальных машин) размещаются в собственной памяти (называемой здесь метапространством)
java.lang.OutOfMemoryError: request size bytes for reason. Out of swap space?
Причина: Подробное сообщение "запросить размер байта по причине. Недостаточно места подкачки?" представляется исключением OutOfMemoryError
. Однако код виртуальной машины Java HotSpot сообщает об этом явном исключении, когда выделение из собственной кучи завершилось неудачно, а собственная куча может быть близка к исчерпанию
java.lang.OutOfMemoryError: Compressed class space
Причина: На 64-битных платформах указатель на метаданные класса может быть представлен 32-битным смещением (с UseCompressedOops). Это контролируется флагом командной строки UseCompressedClassPointers (по умолчанию включен).
Если используется UseCompressedClassPointers
, объем пространства, доступного для метаданных класса, устанавливается равным CompressedClassSpaceSize
. Если пространство, необходимое для UseCompressedClassPointers
, превышает CompressedClassSpaceSize
, java.lang.OutOfMemoryError
с подробностями Сжатое пространство класса выбрасывается.
Примечание: Существует несколько видов метаданных класса - метаданные класса и другие метаданные. Только метаданные класса хранятся в пространстве, ограниченном CompressedClassSpaceSize
. Другие метаданные хранятся в Metaspace.
Должны ли мы использовать файл дампа кучи? Должны ли мы генерировать дамп потока Java? В чем именно разница?
Да. Вы можете использовать этот файл дампа кучи для устранения проблемы с помощью инструментов профилирования, таких как visualvm или mat
Вы можете использовать дамп потока, чтобы получить дополнительную информацию о состоянии потоков.
Обратитесь к этому вопросу SE, чтобы узнать разницу:
Разница между javacore, дампом потока и дампом кучи в Websphere
Каков наилучший способ создания дампов потоков? Является ли kill -3 (наше приложение работает на Solaris) лучшим способом убить приложение и создать дамп потока? Есть ли способ создать дамп потока, но не убить приложение?
kill -3 <process_id>
создает дамп потока, и эта команда не завершает процесс Java.