2015-06-22 3 views
1

Собственный метод fillInStackTrace в open-jdk делает вызов JVM_FillInStackTrace (env, throwable) Непоставлен ли источник этого метода?Внутренние исключения Java

throw - инструкция jvm athrow. Нечто похожее на прыжок в сборке Jvm сам по себе является собственным кодом, поэтому все, что реализовано в jvm, тоже является родным. Так есть throw native? Иными словами, Внутренний вызов fillInStackTrace не несет затрат на обычный вызов JNI? (и стоимость заполнения трассировки стека)

Является ли уловка попыток для кэшированных исключений гарантией работы? Как будут заполнены таблицы исключений. Для тех же самых исключений мне будет много разных блоков catch?

Действительно ли они являются дорогостоящими в веб-приложении (или с аналогичными задержками)? Скажите веб-службу get/employee/{invalid_id} throwing javax.ws.rs NotFoundException вместо использования if/else для возврата ответа 404. Учитывая стоимость HTTP-запроса, ответа и объекта-сериализации/десериализации Json, стоимость исключения невелика.

+0

Вообще говоря, заполнение трасс стека относительно дорого.Это может быть приемлемым для случаев, которые должны быть редки на практике, но простая логика 'if' /' else' будет быстрее, если она доступна. –

+0

IIRC, это что-то вроде 95% стоимости выброса нового исключения. – chrylis

+0

* «Действительно ли они дорогостоящие» * - нет ответа на генрал, сравнивайте ваши данные. – the8472

ответ

1

Когда создается объект исключения, необходимо захватить стек. JVM делает это, пройдя стек java, чтобы найти все методы в цепочке вызовов, ведущие к этой точке.

Стоимость метода fillInStackTrace пропорциональна глубине java-стека при вызове метода. JNI против собственных накладных расходов является низким по сравнению с этой стоимостью.

Исключение исключений не зависит от использования кэшированного исключения или недавно созданного. При выполнении байт-кода athrow JVM просматривает стек java и ищет метод, который может иметь блокирующий блок, способный обрабатывать текущий тип исключения.

Исключения предназначены для исключительных событий и не должны использоваться для потока управления.

0

На практике исключениями являются, используемые для нелокального потока управления. Например, jruby и scala (и, возможно, другие языки на основе JVM) используют их для разрыва в функциональных телах цикла или возврата из внешней функции из замыканий.

Но они используют оптимизированные, которые не заполняют трассировку стека и/или с использованием предварительно выделенных исключений, которые JVM оптимизирует в goto, если он может их встроить. Но это специализированные случаи, когда нет других вариантов.

В общем случае исключения должны использоваться только для обозначения исключительного поведения.
Исключительно может все еще иметь в виду ожидаемый, но необычный в случаях, которые можно рассматривать как медленный путь кода, где исключение-восстановление так дорого, в любом случае генерирование исключения является незначительной ценой для сравнения. Различные сетевые исключения были бы примером, поскольку сети никогда не были на 100% надежными, но ошибки не доминируют в большинстве операций.