2017-02-08 9 views
4

я вижу ссылки на предварительно выделены исключения JVM есть: - http://www.oracle.com/technetwork/java/javase/relnotes-139183.html - http://dev.clojure.org/display/community/Project+Ideas+2016Что представляют собой предопределенные исключения jvm?

Но, глядя на что я вижу только информацию о пропавших без вести stacktraces. Что такое исключения JVM? Это похоже на оптимизацию.

Как это работает и каковы его компромиссы?

+2

Обратите внимание, что предопределенные исключения не являются исключительными исключениями, основанными на JVM. Вы также можете предварительно распределять и повторно использовать экземпляры исключений в чистом java, на самом деле это стандартные библиотеки и сторонние. – the8472

+0

@ the8472 У вас была бы ссылка, если бы у вас была такая возможность? – nha

+1

нет ссылок, но я знаю, что jruby использует предопределенные исключения, чтобы сделать нелокальный поток управления менее болезненным. – the8472

ответ

7

Эти исключения, которые предопределенные на старте виртуальной машины Java. предопределенных исключения должны быть неявным: они выбрасываются на JVM, а не throw new ..., когда происходит неожиданное условие: разыменования нулевого указателя, доступ массива с отрицательным индексом и т.д.

Когда метод начинают бросать (неявно) один из этих исключений too frequently, JVM замечает это и заменяет выделение исключения на каждый бросок с металированием уже предварительно выделенного исключения без stacktrace.

Этот механизм зависит от реализации, так что, если мы говорим о точке доступа вы можете найти список этих исключений в graphKit.cpp:

NullPointerException 
ArithmeticException 
ArrayIndexOutOfBoundsException 
ArrayStoreException 
ClassCastException 

Обоснование довольно проста: самая дорогая часть бросает исключение не является фактическим броском и отказом стека, но создает исключение stacktrace в исключении (это относительно медленный вызов виртуальной машины и происходит в конструкторе исключений через Throwable#fillInStackTrace). Чтобы найти конкретные цифры и относительную стоимость, вы можете прочитать потрясающую статью инженера по работе с hotspot о exceptional performance.

Некоторые люди используют исключения для регулярного потока управления (пожалуйста, не делайте этого) или для повышения эффективности (что обычно неверно, например, см. this вид популярной структуры пула соединений), поэтому hotspot делает этот код [вероятно, плохо] немного быстрее, выбрасывая уже созданное исключение без stacktrace (поэтому устраняется самая дорогая часть метания).

Недостатком этого подхода является то, что теперь у вас есть исключение из stacktraceless. Это неважно: если эти неявные исключения бросаются так часто, вы, вероятно, не используете их стек стеков.Но если это предположение неверно, у вас будут исключения без следов в ваших журналах. Чтобы предотвратить это, вы можете использовать -XX:-OmitStackTraceInFastThrow

2

релиз отмечает, вы вывесили объяснить особенность:

Чтение примечания к выпуску в своем сообщении: «Компилятор на сервере VM теперь обеспечивает правильные цепочки вызовов стеки для всех„холодного“встроенных исключений . Для выполнения целей, когда такое исключение несколько раз, метод может быть повторно. После перекомпиляции, компилятор может выбрать более быструю тактику, используя предопределенные исключения, которые не обеспечивают трассировку стека. "

Да , это оптимизация.

Чтобы увеличить скорость обработки исключений, исключения, которые выбрасываются часто, могут быть предварительно распределены.

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

Вы можете удалить эту функцию с помощью флага -XX:-OmitStackTraceInFastThrow

Смежные вопросы