У меня периодически возникает проблема на сервере сборки, когда Java-процесс в сборке как-то не завершается и, кажется, продолжает работать (используя 100% ЦП) вечно (я видел, что он работает более 2 дней в течение выходные, где обычно это занимает около 10 минут). kill -9 pid
кажется единственным способом остановить процесс.
Я попытался вызвать kill -QUIT pid
в процессе, но, похоже, он не производит трассировку стека в STDOUT (может быть, он не отвечает на сигнал?). Jstack без опции -F force, кажется, не может подключиться к работающей JVM, но с опцией force он производит вывод, включенный ниже.
К сожалению, даже с этой трассировкой стека я не вижу никакого очевидного пути для дальнейшего исследования.
Насколько я могу судить, он показывает два «BLOCKED» потока, которые запустили Object.wait (их стеки, по-видимому, содержат только основной код Java, но не наш), а третий - IN_VM без вывода стека.
Какие шаги я должен предпринять, чтобы собрать больше информации о причине проблемы (или еще лучше, как я могу ее решить)?
$ /opt/jdk1.6.0_29/bin/jstack -l -F 5546
Attaching to process ID 5546, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.4-b02
Deadlock Detection:
No deadlocks found.
Finding object size using Printezis bits and skipping over...
Thread 5555: (state = BLOCKED)
Locked ownable synchronizers:
- None
Thread 5554: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=118 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove() @bci=2, line=134 (Interpreted frame)
- java.lang.ref.Finalizer$FinalizerThread.run() @bci=3, line=159 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 5553: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.Object.wait() @bci=2, line=485 (Interpreted frame)
- java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=116 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 5548: (state = IN_VM)
Locked ownable synchronizers:
- None
(Java версии 1.6.0, обновление 29, работает в Scientific Linux выпуск 6.0)
Обновление:
Запуск strace -f -p 894
создает, казалось бы, бесконечный поток ...
[pid 900] sched_yield() = 0
[pid 900] sched_yield() = 0
...
и затем, когда Ctrl-Cd
Process 894 detached
...
Process 900 detached
...
Process 909 detached
jmap -histo 894
не подключается, но jmap -F -histo 894
возвращает ...
Attaching to process ID 894, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.4-b02
Iterating over heap. This may take a while...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Object Histogram:
num #instances #bytes Class description
--------------------------------------------------------------------------
1: 11356 1551744 * MethodKlass
2: 11356 1435944 * ConstMethodKlass
3: 914 973488 * ConstantPoolKlass
4: 6717 849032 char[]
5: 16987 820072 * SymbolKlass
6: 2305 686048 byte[]
7: 914 672792 * InstanceKlassKlass
8: 857 650312 * ConstantPoolCacheKlass
9: 5243 167776 java.lang.String
10: 1046 108784 java.lang.Class
11: 1400 87576 short[]
12: 1556 84040 * System ObjArray
13: 1037 64584 int[]
14: 103 60152 * ObjArrayKlassKlass
15: 622 54736 java.lang.reflect.Method
16: 1102 49760 java.lang.Object[]
17: 937 37480 java.util.TreeMap$Entry
18: 332 27960 java.util.HashMap$Entry[]
19: 579 27792 java.nio.HeapByteBuffer
20: 578 27744 java.nio.HeapCharBuffer
21: 1021 24504 java.lang.StringBuilder
22: 1158 24176 java.lang.Class[]
23: 721 23072 java.util.HashMap$Entry
24: 434 20832 java.util.TreeMap
25: 689 18936 java.lang.String[]
26: 238 17440 java.lang.reflect.Method[]
27: 29 16800 * MethodDataKlass
28: 204 14688 java.lang.reflect.Field
29: 330 13200 java.util.LinkedHashMap$Entry
30: 264 12672 java.util.HashMap
...
585: 1 16 java.util.LinkedHashSet
586: 1 16 sun.rmi.runtime.NewThreadAction$2
587: 1 16 java.util.Hashtable$EmptyIterator
588: 1 16 java.util.Collections$EmptySet
Total : 79700 8894800
Heap traversal took 1.288 seconds.