как генерировать поток, чернят Java из ошибки памяти

  • делает java 6, генерируют дамп потока в дополнение к дампу "кучи" (java_pid14941.hprof)

  • это - то, что произошло с одним из моих приложений.

    java.lang. OutOfMemoryError: GC наверху ограничивает превышенную "кучу" Дампа java_pid14941.hprof...

  • Я действительно находил ava_pid14941.hprof в рабочем каталоге, но не нашел файла, который содержит дамп потока. Я должен знать то, что делали все потоки, когда я получил эту ошибку OutOfMemory.

  • Есть ли какой-либо параметр конфигурации, который генерирует дамп потока в дополнение к, сваливают дамп в кучу из исключения памяти?

11
задан Jigar 7 May 2010 в 10:57
поделиться

3 ответа

Как сгенерировать Java-дамп потока при ошибке нехватки памяти?

Ваш вопрос можно упростить до:

  • как создать дамп потока

и:

  • как отловить ошибку нехватки памяти (не обращайте внимания на скептиков, они упускают общую картину, см. мой комментарий)

Так что на самом деле это довольно просто , вы можете сделать это так:

  • установите обработчик неперехваченных исключений по умолчанию

  • после перехвата неперехваченного исключения, проверьте, есть ли у вас OutOfMemoryError

  • , если у вас есть OutOfMemoryError, создайте себе полный дамп потока и либо спросите пользователь может отправить его вам по электронной почте или предложить отправить его автоматически

Бонус: он отлично работает и на 1.5:)

 Thread.setDefaultUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler() {
     public void uncaughtException( final Thread t, final Throwable e ) {
         ...
     }

Вы можете изучить это:

 e.getMessage();

и это:

Thread.getAllStackTraces();

I ' m делает это все время в приложении, которое поставляется на сотнях различных JVM 1.5 и 1.6 (в разных ОС).

14
ответ дан 3 December 2019 в 01:51
поделиться

Я не думаю, что в java есть что-то, что могло бы предоставить вам дампы потоков на выходе. Я решаю эту проблему при необходимости с помощью cronjob, который периодически kill -3 pid. Да, это немного загромождает журналы, но след все равно ничтожен.

И если вы страдаете от OOM, было бы полезно посмотреть, как ситуация развивается по потокам.

0
ответ дан 3 December 2019 в 01:51
поделиться

Если вы работаете в среде Linux / Unix, вы можете сделать это:

-XX:OnOutOfMemoryError="kill -3 pid"

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

20
ответ дан 3 December 2019 в 01:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: