我在構建服務器上存在間歇性問題,構建中的某個Java進程無法終止,並且似乎永遠持續運行(使用100%的CPU)(我已經看到它在整個週末運行了2天以上通常需要大約10分鐘)。似乎是阻止這一進程的唯一途徑。這個Java進程爲什麼沒有終止?
我已經試過在進程上調用kill -QUIT pid
,但它似乎沒有產生任何堆棧跟蹤到STDOUT(也許它沒有響應信號?)。沒有-F強制選項的jstack似乎無法連接到正在運行的JVM,但使用強制選項時,它確實會生成下面的輸出。
不幸的是,即使有堆棧跟蹤,我也看不到有任何明顯的路徑需要進一步調查。
據我可以告訴它顯示兩個運行Object.wait的'BLOCKED'線程(它們的堆棧似乎只包含核心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,科學運行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.
您可以嘗試在運行服務器的控制檯上按[CTRL] + [SYSREQ]。這會給你一個線程轉儲,它會像獲取的那樣冗長。 – JimmyB