Спецификация Java 11: 11.1.3. Асинхронные исключения

Большинство исключений возникают синхронно в результате действия потока, в котором они возникают, и в той точке программы, которая указана для возможного возникновения такого исключения. Асинхронное исключение, напротив, является исключением, которое потенциально может произойти в любой момент выполнения программы.

Асинхронные исключения возникают только в результате:

  • Вызов (устаревшего) метода stop класса Thread или ThreadGroup.
  • Методы stop (устаревшие) могут быть вызваны одним потоком для воздействия на другой поток или все потоки в указанной группе потоков. Они асинхронны, потому что могут возникать в любой момент выполнения другого потока или потоков.
  • Внутренняя ошибка или ограничение ресурсов в виртуальной машине Java, которые не позволяют ей реализовать семантику языка программирования Java. В этом случае вызываемое асинхронное исключение является экземпляром подкласса VirtualMachineError.
    Обратите внимание, что StackOverflowError, подкласс VirtualMachineError, может быть вызван синхронно при вызове метода, а также асинхронно из-за выполнения собственного метода или ограничений ресурсов виртуальной машины Java. Точно так же OutOfMemoryError, другой подкласс VirtualMachineError, может вызываться синхронно во время создания экземпляра класса, создания массива, инициализации класса и преобразования упаковки (boxing conversion), а также асинхронно.

Платформа Java SE допускает выполнение небольшого, но ограниченного объема выполнения, прежде чем возникнет асинхронное исключение.

Асинхронные исключения редки, но правильное понимание их семантики необходимо для создания высококачественного машинного кода.

Указанная выше задержка позволяет оптимизированному коду обнаруживать и генерировать эти исключения в точках, где их целесообразно обрабатывать, соблюдая семантику языка программирования Java. Простая реализация может опрашивать асинхронные исключения в точке каждой инструкции передачи управления. Поскольку программа имеет конечный размер, это обеспечивает ограничение общей задержки при обнаружении асинхронного исключения. Поскольку между передачами управления не будет асинхронного исключения, генератор кода имеет некоторую гибкость для изменения порядка вычислений между передачами управления для повышения производительности.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки