Каковы надлежащие планы действий для устранения проблемы мертвой блокировки, если она находится в среде PRODUCTION? - PullRequest
5 голосов
/ 21 августа 2011

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

Вопрос

  • Лучшая практика планов относительно шагов анализа.

Предположение

  • вы уже знаете, что один сервер поражен этой проблемой.
  • ОС использует Linux.

Цель

  • Вы хотите узнать основную причину и устранить ее.

Ответы [ 3 ]

4 голосов
/ 21 августа 2011
  1. Отправляет серверу сигнал SIGQUIT для принудительного создания дампа стека. Если вы используете Windows, вы можете получить сопоставимый дамп, используя jconsole. Может . Но жизнь намного проще, если вы запускаете серверы в Linux.
  2. Проверьте дамп стека, чтобы найти тупик
  3. Зная, что это такое, попробуйте воспроизвести на тестовом сервере
  4. Если вы можете воспроизвести его, исправьте его, а затем протестируйте на тестовом сервере
1 голос
/ 21 августа 2011

Просто найдите еще один полезный совет по советам Эрнеста.http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/

Некоторые советы в этой статье.

В Windows вы можете использовать <ctrl><break> пример результата здесь.

2011-08-27 19:48:38
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.2-b03 mixed mode):

"DestroyJavaVM" prio=6 tid=0x00000000003db000 nid=0x414 waiting on condition [0x
0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Thread-1" prio=6 tid=0x0000000006621800 nid=0x2178 waiting for monitor entry [0
x0000000006f8f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at SimpleDeadLock$Thread2.run(SimpleDeadLock.java:33)
        - waiting to lock <0x00000000ebc3c3e8> (a java.lang.Object)
        - locked <0x00000000ebc3c3f8> (a java.lang.Object)

"Thread-0" prio=6 tid=0x000000000661f000 nid=0x1f50 waiting for monitor entry [0
x0000000006e8f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at SimpleDeadLock$Thread1.run(SimpleDeadLock.java:20)
        - waiting to lock <0x00000000ebc3c3f8> (a java.lang.Object)
        - locked <0x00000000ebc3c3e8> (a java.lang.Object)

"Low Memory Detector" daemon prio=6 tid=0x0000000006603000 nid=0x1118 runnable [
0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x0000000006600800 nid=0x1340 waiting on
 condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x00000000065ee000 nid=0x1e10 waiting on
 condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x00000000065a2800 nid=0xebc runnable [0x00
00000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x000000000659d000 nid=0x18b4 waiting on
condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x000000000052d800 nid=0x1b6c in Object.wait() [0x
000000000658f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000ebc01300> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        - locked <0x00000000ebc01300> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(Unknown Source)
        at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)

"Reference Handler" daemon prio=10 tid=0x0000000000523800 nid=0x2054 in Object.w
ait() [0x000000000648f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000ebc011d8> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
        - locked <0x00000000ebc011d8> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x000000000051b800 nid=0x1f44 runnable

"GC task thread#0 (ParallelGC)" prio=6 tid=0x0000000000476000 nid=0x25c runnable


"GC task thread#1 (ParallelGC)" prio=6 tid=0x0000000000478800 nid=0x1ef0 runnabl
e

"GC task thread#2 (ParallelGC)" prio=6 tid=0x000000000047b000 nid=0x1d88 runnabl
e

"GC task thread#3 (ParallelGC)" prio=6 tid=0x000000000047c800 nid=0x1e3c runnabl
e

"VM Periodic Task Thread" prio=10 tid=0x000000000661c000 nid=0x1f40 waiting on c
ondition

JNI global references: 882


Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x000000000052abb0 (object 0x00000000ebc3c3e8, a java.
lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x000000000052d460 (object 0x00000000ebc3c3f8, a java.
lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at SimpleDeadLock$Thread2.run(SimpleDeadLock.java:33)
        - waiting to lock <0x00000000ebc3c3e8> (a java.lang.Object)
        - locked <0x00000000ebc3c3f8> (a java.lang.Object)
"Thread-0":
        at SimpleDeadLock$Thread1.run(SimpleDeadLock.java:20)
        - waiting to lock <0x00000000ebc3c3f8> (a java.lang.Object)
        - locked <0x00000000ebc3c3e8> (a java.lang.Object)

Found 1 deadlock.

Heap
 PSYoungGen      total 18176K, used 937K [0x00000000ebc00000, 0x00000000ed040000
, 0x0000000100000000)
  eden space 15616K, 6% used [0x00000000ebc00000,0x00000000ebcea520,0x00000000ec
b40000)
  from space 2560K, 0% used [0x00000000ecdc0000,0x00000000ecdc0000,0x00000000ed0
40000)
  to   space 2560K, 0% used [0x00000000ecb40000,0x00000000ecb40000,0x00000000ecd
c0000)
 PSOldGen        total 41472K, used 0K [0x00000000c3400000, 0x00000000c5c80000,
0x00000000ebc00000)
  object space 41472K, 0% used [0x00000000c3400000,0x00000000c3400000,0x00000000
c5c80000)
 PSPermGen       total 21248K, used 2930K [0x00000000be200000, 0x00000000bf6c000
0, 0x00000000c3400000)
  object space 21248K, 13% used [0x00000000be200000,0x00000000be4dc9f8,0x0000000
0bf6c0000)

Контрольный список эксперта

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

Подводя итог, вот шаги, которые нужно предпринять, когда вы в следующий раз столкнетесь с проблемой Java-программы:

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

Для аварийных, прерванных программ : В UNIX найдите файл ядра.Вы можете проанализировать этот файл в собственном инструменте отладки, таком как gdb или dbx.Ищите потоки, которые вызвали собственные методы.Поскольку технология Java использует безопасную модель памяти, возможно, любое повреждение произошло в собственном коде.Помните, что JVM также использует собственный код, поэтому он не обязательно может быть ошибкой в ​​вашем приложении.

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

Удачи и счастливой отладки

Действительно хорошая официальная статья!Просто хочу поделиться с вами!

Команда отправки SIGQUIT будет несколько отличаться в разных ОС.

Но не главная проблема здесь.

0 голосов
/ 27 августа 2011

Я нахожу другой вариант, чтобы увидеть трассировку стека потоков помимо команды ОС.Для этого используется jstack pid.

Но jstack в настоящее время недоступен на платформах Windows или Linux Itanium.

Существует даже инструмент анализа трассировки стека , который можно найти в одном сообщении SO.

Существует очень подробный пошаговый процесс из этогопочта !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...