J'ai (le dernier en date) jdk 1.6.0.18 plantant lors de l'exécution d'une application web sur (le dernier en date) tomcat 6.0.24 de manière inattendue après
4 à 24 heures
4 heures à 8 jours de tests de stress (30 threads frapper l'application à 6 millions de pages vues/jour). C'est sur RHEL 5.2 (Tikanga).JVM se bloque sous tension sur RHEL 5.2
Le rapport d'accident est à http://pastebin.com/f639a6cf1 et les cohérentes parties de l'accident sont:
- SIGSEGV est jeté
- sur libjvm.so
- espace eden est toujours plein (100%)
machine virtuelle Java fonctionne avec les options suivantes:
CATALINA_OPTS="-server -Xms512m -Xmx1024m -Djava.awt.headless=true"
J'ai également testé la mémoire pour des problèmes matériels en utilisant http://memtest.org/ pendant 48 heures (14 passages de toute la mémoire) sans aucune erreur.
J'ai activé -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
pour inspecter les tendances du GC ou l'épuisement de l'espace, mais il n'y a rien de suspect là-bas. GC et GC complet se produit à des intervalles prévisibles, libérant presque toujours la même quantité de capacités de mémoire.
Mon application n'utilise directement aucun code natif.
Des idées d'où je devrais regarder ensuite?
Edition - plus d'info:
1) Il n'y a pas vm client dans ce 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) Modification de l'O/S est impossible.
3) Je ne veux pas modifier les variables de test de stress JMeter car cela pourrait cacher le problème. Depuis que j'ai un cas d'utilisation (le scénario de test de stress actuel) qui bloque la JVM, je voudrais réparer le crash et ne pas changer le test.
4) J'ai fait static analysis sur mon application mais rien de sérieux n'est apparu.
5) La mémoire ne s'allonge pas avec le temps. L'utilisation de la mémoire s'équilibre très rapidement (après le démarrage) selon une tendance très stable qui ne semble pas suspecte.
6)/var/log/messages ne contient pas d'informations utiles avant ou pendant le temps de l'accident
Plus d'info: Vous avez oublié de mentionner qu'il y avait un apache (2.2.14) fronting tomcat en utilisant mod_jk 1.2.28. En ce moment, je lance le test sans apache juste au cas où le crash JVM se rapporte au code natif mod_jk qui se connecte à JVM (connecteur tomcat). Après cela (si JVM se bloque à nouveau), je vais essayer de supprimer certains composants de mon application (mise en cache, lucene, quartz) et plus tard j'essaierai d'utiliser jetty. Étant donné que l'accident se produit actuellement entre 4 heures et 8 jours, cela peut prendre beaucoup de temps pour savoir ce qui se passe.
Cela doit aller à
SunOracle. – bmargulies@bmargulies: C'est ce que j'ai d'abord pensé, mais ensuite je lis http://stackoverflow.com/questions/1353514/anyone-tried-submitting-hserr-files-to-sun – cherouvim
En supposant que vous utilisez un JDK récent, avez-vous essayé d'étudier son comportement en temps réel avec VisualVM? Nous avons constaté qu'il est beaucoup plus efficace que les profils de tiers pour enquêter sur les fuites. – Uri