Ошибка виртуальной машины |
Java.lang.VirtualMachineError выдается, когда виртуальная машина Java сталкивается с какой-либо внутренней ошибкой или ограничением ресурсов, которые не позволяют ей работать. Это механизм самозащиты, используемый JVM для предотвращения сбоя всего приложения. В этой статье давайте обсудим различные типы VirtualMachineError, их характеристики, причины, по которым они срабатывают, и потенциальные решения для их устранения.
Типы VirtualMachineError
Существует четыре различных типа VirtualMachineError:
а. Аутофмемориеррор
б. StackOverflowError
в. Внутренняя ошибка
д. Неизвестная ошибка
Рассмотрим эти типы подробно в этом разделе.
Рис. Иерархия классов Java Throwable
Как и аббревиатура OMG (Oh My God), OOM (OutOfMemoryError) довольно популярен среди сообщества DevOps. . Большинство инженеров DevOps считают, что существует одна ошибка OutOfMemoryError. Но есть 8 различных разновидностей OutOfMemoryError:
java.lang.OutOfMemoryError: пространство кучи Java
java.lang.OutOfMemoryError: превышен лимит накладных расходов GC
java.lang.OutOfMemoryError: Запрошенный размер массива превышает лимит виртуальной машины
java.lang.OutOfMemoryError: Перманентное пространство
java.lang.OutOfMemoryError: Метапространство
java.lang.OutOfMemoryError: невозможно создать новый собственный поток
java.lang.OutOfMemoryError: убить процесс или пожертвовать дочерним элементом
java.lang.OutOfMemoryError: причина stack_trace_with_native_method
Каждый аромат вызывается по разным причинам. Точно так же решения также различны для каждой разновидности OutOfMemoryError. Вот красивая одностраничный документ который суммирует все различные варианты OutOfMemoryError, их причины и решения.
Как правило, OutOfMemoryError можно диагностировать и исправить, анализируя журналы сборки мусора и дампы кучи. Поскольку анализ журналов сборки мусора вручную может быть утомительным, вы можете рассмотреть возможность использования бесплатных инструментов, таких как: GCeasy, HP Jmeter, анализатор IBM GC. Точно так же для анализа дампов кучи вы можете рассмотреть возможность использования бесплатных инструментов, таких как: HeapHeroЗатмение МАТ.
В стеке потока хранится информация о выполняемых им методах, значениях примитивных типов данных, локальных переменных, указателях на объекты и возвращаемых значениях. Все они потребляют память. Если размеры стека потока превышают лимит выделенной памяти, возникает ошибка java.lang.StackOverflowError. Эта проблема обычно возникает, когда поток рекурсивно вызывает одну и ту же функцию снова и снова в результате ошибки в исполняемой программе. Более подробную информацию о том, как отлаживать StackOverflowError и все возможные решения по ее устранению, можно найти здесь. нашел в этой статье.
java.lang.InternalError выдается JVM, когда есть:
Ошибка в программном обеспечении, реализующем виртуальную машину,
Ошибка в базовом программном обеспечении хост-системы
Ошибка в оборудовании.
Но редко вы столкнетесь с InternalError. Чтобы понять, какие конкретные сценарии могут вызвать InternalError, вы можете выполнить поиск строки «InternalError» в базе данных Oracle Java Bug. На момент написания этой статьи (20 декабря 2018 г.) для этой ошибки было зарегистрировано только 200 дефектов в База данных ошибок Oracle Java. Большинство из них фиксированные.
java.lang.UnknownError выдается при возникновении исключения или ошибки, но виртуальная машина Java не может сообщить о фактическом исключении или ошибке. Редко вы увидите UnknownError. Фактически, при поиске «UnknownError» в базе данных Oracle Java Bug на момент написания этой статьи (20 декабря 2018 г.) есть только Сообщено об обнаружении 2 дефектов.
Характеристики
VirtualMachineError имеет несколько основных характеристик:
1. Непроверенное исключение
2.Синхронная и асинхронная доставка
Давайте обсудим эти две характеристики в этом разделе.
(1). Непроверенное исключение
Существует два типа исключений:
a.Проверенные исключения
б.Непроверенные исключения
Исключения, которые проверяются во время компиляции, называются Checked Exception. Если некоторые методы в вашем коде выдают проверенное исключение, то метод должен либо обработать исключение, либо указать исключение с помощью ключевого слова throws. Примеры проверенных исключений: IOException, SQLException, DataAccessException, ClassNotFoundException…
Неотмеченные исключения не имеют этого требования. Их не нужно ловить или объявлять брошенными. Все типы VirtualMachineError являются непроверяемыми исключениями.
(2). Синхронная и асинхронная доставка
Исключения могут создаваться в двух режимах:
асинхронный
б.Асинхронный
Синхронные исключения происходят в конкретном операторе программы, независимо от того, сколько раз программа выполняется в аналогичной среде. Примерами синхронных исключений являются NullPointerException, ArrayIndexOutOfBoundException и т. д.…
Асинхронные исключения могут возникнуть в любой момент времени и в любой части оператора программы. Там, где его можно бросить, не будет согласованности. Все ошибки VirtualMachineError генерируются асинхронно, но иногда они также могут генерироваться синхронно. Ошибка StackOverflowError может возникать синхронно при вызове метода, а также асинхронно из-за выполнения собственного метода или ограничений ресурсов виртуальной машины Java. Точно так же OutOfMemoryError может быть вызван синхронно во время создания объекта, создания массива, инициализации класса и преобразования упаковки, а также асинхронно.