Ho (il più recente) jdk 1.6.0.18 si blocca mentre si esegue un'applicazione Web (il più recente) tomcat 6.0.24 in modo imprevisto dopo
4 a 24 ore
4 ore a 8 giorni di stress test (30 thread che colpiscono l'app a 6 milioni di pagine/giorno). Questo è su RHEL 5.2 (Tikanga).JVM si arresta in modo anomalo su RHEL 5.2
La relazione crash è a http://pastebin.com/f639a6cf1 ei coerenti parti del crollo sono:
- un SIGSEGV viene gettata
- su libjvm.so
- spazio Eden è sempre pieno (100%)
JVM viene eseguito con le seguenti opzioni:
CATALINA_OPTS="-server -Xms512m -Xmx1024m -Djava.awt.headless=true"
Ho anche testato la memoria per problemi hardware utilizzando http://memtest.org/ per 48 ore (14 passaggi dell'intera memoria) senza errori.
Ho abilitato -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
per controllare eventuali tendenze del GC o esaurimento dello spazio, ma non c'è nulla di sospetto lì. GC e GC completo avvengono a intervalli prevedibili, liberando quasi sempre la stessa quantità di capacità di memoria.
La mia applicazione non utilizza direttamente alcun codice nativo.
Qualche idea su dove dovrei guardare dopo?
Edit - maggiori informazioni:
1) Non v'è alcun vm cliente in questo JDK:
[[email protected] ~]$ java -version -server
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)
[[email protected] ~]$ java -version -client
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)
2) Modifica della O/S non è possibile.
3) Non voglio modificare le variabili di stress test JMeter poiché questo potrebbe nascondere il problema. Dal momento che ho un caso d'uso (lo scenario di stress test attuale) che blocca la JVM vorrei correggere l'incidente e non cambiare il test.
4) Ho fatto static analysis sulla mia applicazione ma non è venuto fuori nulla di serio.
5) La memoria non cresce nel tempo. L'utilizzo della memoria si bilancia molto rapidamente (dopo l'avvio) con una tendenza molto costante che non sembra sospetta.
6)/var/log/messaggi non contiene alcuna informazione utile, prima o durante il momento del crash
Maggiori informazioni: dimenticato di dire che c'era un apache (2.2.14) Tomcat fronteggia usando mod_jk 1.2.28. In questo momento sto eseguendo il test senza apache nel caso in cui l'arresto JVM si riferisca al codice nat_jk mod_jk che si connette a JVM (connettore tomcat).
Successivamente (se JVM si arresta di nuovo) proverò a rimuovere alcuni componenti dalla mia applicazione (caching, lucene, quarzo) e più avanti proverò a usare il molo. Poiché l'incidente si verifica attualmente in qualsiasi momento tra 4 ore e 8 giorni, potrebbe essere necessario molto tempo per scoprire cosa sta succedendo.
Questo deve andare a
SunOracle. – bmargulies@bmargulies: Questo è quello a cui inizialmente pensavo, ma poi ho letto http://stackoverflow.com/questions/1353514/uncuno-secondo-sottimando-hserr-files-to-sun – cherouvim
Presumendo che tu usi un JDK recente, hai provato a studiare il suo comportamento in tempo reale con VisualVM? Abbiamo scoperto che è molto più efficace dei profili di terze parti a indagare sulle perdite. – Uri