2011-01-11 4 views
40

В моем журнале приложений (с использованием log4j) я вижу исключение NullPointerException, но без трассировки стека. Я знаю, что в качестве оптимизации, когда исключение происходит много раз - jvm перестает создавать трассировку стека. Проблема заключается в том, что это произошло некоторое время назад, и все мои журналы заполняются исключением без трассировки стека. Есть ли способ «перезагрузить» этот механизм, поэтому следующее исключенное исключение будет напечатано с полной трассировкой стека? Я не хочу перезапускать приложение, так как трудно воспроизвести эту ошибку, и перезапуск может привести к «удалению» ...Повторяющееся исключение без трассировки стека - как сбросить?

Спасибо!

+1

«Я знаю, что в качестве оптимизации, когда исключение происходит много раз - jvm перестает создавать трассировку стека». Вы знаете это как? Неправда. – skaffman

+0

это может быть из-за того, что в блоке catch заблокирована только причина исключения –

+3

Да, это своего рода оптимизация - см. Ответ @dogbane. @Jigar - это не связано с протоколированием, само исключение не имеет трассировки стека. – duduamar

ответ

66

Попробуйте запустить следующую JVM собственности:

-XX:-OmitStackTraceInFastThrow 

Из Release Notes:

Компилятора на сервере VM Теперь обеспечивает корректные цепочки вызовов стеки для все «холодного» встроенного исключения. Для целей производительности , когда такое исключение выбрасывается несколько раз, метод может быть перекомпилирован. После перекомпиляции компилятор может выбрать более быструю тактику с использованием предварительно выделенных исключений, которые не предоставляют стек trace. Чтобы полностью отключить использование предопределенных исключений , используйте этот флаг : -XX:-OmitStackTraceInFastThrow.

+2

Спасибо, это звучит хорошо. Возможно ли включить этот флаг «на лету» для запуска java-процесса? – duduamar

+0

@duduamar Я не знаю наверняка, но я предполагаю, что вы не можете. – dogbane

+1

@duduamar: теперь есть открытый билет для изменения этого флага во время выполнения - [JDK-8046503 - Возможность сброса счетчика OmitStackTraceInFastThrow] (https://bugs.openjdk.java.net/browse/JDK-8046503). Хотя все еще открыта. – sleske

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