Ho un problema intermittente su un server di build in cui un processo Java nella build non riesce in qualche modo a terminare e sembra continuare a funzionare (usando il 100% della CPU) per sempre (l'ho visto funzionare per 2+ giorni durante il fine settimana dove normalmente ci vogliono circa 10 minuti). kill -9 pid
sembra essere l'unico modo per interrompere il processo.Perché questo processo Java non riesce a terminare?
Ho provato a chiamare kill -QUIT pid
sul processo, ma non sembra produrre alcuna traccia di stack su STDOUT (forse non risponde al segnale?). jstack senza l'opzione -F force sembra non essere in grado di connettersi alla JVM in esecuzione, ma con l'opzione force produce l'output incluso di seguito.
Sfortunatamente, anche con quella traccia di stack non riesco a vedere alcun percorso ovvio per ulteriori indagini.
Per quanto ne so, mostra due thread "BLOCCATI" che hanno eseguito Object.wait (i loro stack sembrano contenere solo il codice Java principale, niente dei nostri) e un terzo che è "IN_VM" senza uscita stack .
Quali passi devo prendere per raccogliere maggiori informazioni sulla causa del problema (o meglio ancora, come posso risolverlo)?
$ /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
(versione Java 1.6.0 update 29, in esecuzione su Scientific Linux rilascia 6,0)
Aggiornamento:
Esecuzione strace -f -p 894
produce un flusso apparentemente infinito di ...
[pid 900] sched_yield() = 0
[pid 900] sched_yield() = 0
...
e quindi quando Ctrl-Cd
Process 894 detached
...
Process 900 detached
...
Process 909 detached
jmap -histo 894
non di connessione, ma jmap -F -histo 894
ritorna ...
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.
Si può provare a premere [CTRL] + [SYSREQ] sulla console in cui viene eseguito il server. Questo ti darà un dump del thread che sarà verboso come si ottiene. – JimmyB