Full GC deviennent très fréquentes
J'ai un Java webapp en cours d'exécution sur une instance de tomcat. Pendant les périodes de pointe de la webapp sert environ 30 pages par seconde et normalement de l'ordre de 15.
Mon environnement est:
O/S: SUSE Linux Enterprise Server 10 (x86_64)
RAM: 16GB
server: Tomcat 6.0.20
JVM: Java HotSpot(TM) 64-Bit Server VM 1.6.0_14
JVM options:
CATALINA_OPTS="-Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m
-XX:+UseParallelGC
-Djava.awt.headless=true
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"
JAVA_OPTS="-server"
Après une couple de jours de disponibilité de la Pleine GC commence à se produire plus fréquemment et il devient un sérieux problème pour l'application de la disponibilité. Après un tomcat redémarrer le problème disparaît, mais, bien sûr, est de retour après 5 à 10 ou de 30 jours (non conformes).
La Pleine GC journal avant et après un redémarrage est à http://pastebin.com/raw.php?i=4NtkNXmi
Il montre un journal avant de le redémarrer à 6,6 jours de disponibilité où l'application a été la souffrance, car la Pleine GC nécessaire de 2,5 secondes et qui se passe tous les ~6 secondes.
Puis il montre un journal, juste après le redémarrage, où tous les GC n'est arrivé à toutes les 5-10 minutes.
J'en ai deux décharges à l'aide de jmap -dump:format=b,file=dump.hprof PID
lorsque la totalité du GCs où les cours (je ne suis pas sûr de savoir si j'ai raison lorsqu'un Full GC était en cours ou entre les 2 Cg) et les ouvrit en http://www.eclipse.org/mat/ mais ne pas obtenir quelque chose d'utile dans la Fuite des Suspects:
- 60MO: 1 exemple de "org.mise en veille prolongée.impl.SessionFactoryImpl" (j'utilise hibernate avec ehcache)
- 80MB: 1 024 en cas de "org.apache.tomcat.util.les threads.ThreadWithAttributes" (ce sont probablement les 1024 travailleurs de tomcat)
- 45 MO: 37 instances de "net.sf.ehcache.magasin.composé.impl.MemoryOnlyStore" (ce doit être mon ~37 cache régions ehcache)
Noter que je n'ai jamais eu un OutOfMemoryError.
Toutes les idées sur où dois-je chercher la prochaine?
Je n'ai jamais eu un OutOfMemoryError j'ai donc pensé que, puisque l'application peut s'exécuter alors c'est ok. Aussi, j'ai lu que le fait de donner trop de mémoire de la JVM va faire le Plein GC plus lent. Est-ce vrai?
Pouvez-vous reproduire le comportement dans un environnement de test? Peut-être avec certains tests de charge. J'ai débogué comportement comme ça avant, mais généralement avec BEAUCOUP de l'aide d'un profileur (qui va tuer votre serveur en production env).
aussi @cherouvim avez-vous vu oracle.com/technetwork/java/javase/gc-tuning-6-140523.html ? pourrait être utile.
"Je n'ai jamais eu un OutOfMemoryError" - pas tous la mémoire est utilisée, mais le GC se produisent parce que l'ancienne génération est pleine. Allouer plus de mémoire sera de garder des objets dans le jeune gen pour plus plus susceptibles d'obtenir nettoyé par un mineur collection / moins de chances de promotion.
OriginalL'auteur cherouvim | 2011-10-27
Vous devez vous connecter pour publier un commentaire.
Quand nous avons eu ce problème nous avons finalement fait le suivi jusqu'à la jeune génération étant trop petits. Bien que nous avait donné beaucoup de ram, la jeune génération n'a pas reçu sa juste part.
Cela signifie que les petites ordures collections de se produire plus fréquemment et a causé certains objets jeunes à être déplacé dans la pensionnaire de génération de sens plus large la collecte des poubelles aussi.
Essayez d'utiliser le
-XX:NewRatio
avec une assez faible valeur (disons 2 ou 3) et voir si cela aide.Plus d'informations peuvent être trouvées ici.
OriginalL'auteur Jim
J'ai basculé de la
-Xmx1024m
à-Xmx2048m
et le problème a disparu. J'ai maintenant 100 jours de disponibilité.OriginalL'auteur cherouvim
Ce qui se passe dans votre cas, c'est que vous avez beaucoup d'objets qui vivent un peu plus longtemps que NewGen cycle de vie. Si les survivants de l'espace est trop petit, ils vont directement à la OldGen.
-XX:+PrintTenuringDistribution
pourrait donner un aperçu. Votre NewGen est assez grand, donc essayez de diminuerSurvivorRatio
.aussi, jconsole fournira probablement plus visuelle aperçu de ce qui se passe avec votre mémoire, de l'essayer.
OriginalL'auteur Denis Tulskiy
À côté de tuning les différentes options de la JVM je vous suggère aussi de mettre à niveau vers une version plus récente de la VM, parce que les versions ultérieures ont beaucoup mieux à l'écoute de garbage collector (également sans essayer de nouvelles expérimentale).
A côté de cela, aussi, si c'est (partiellement) vrai que l'attribution de plus de mémoire de la JVM peut augmenter le temps nécessaire pour effectuer la GC c'est un compromis entre l'aide de l'ensemble de 16 GO de mémoire et augmenter la mémoire de votre profession, de sorte que vous pouvez essayer le double de toutes les valeurs, à commencer
Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m
Ce qui concerne
Massimo
Peut être, je suggère que les paramètres ont été qu'une simple supposition. Je voudrais signaler la mise à jour de la JVM est une meilleure chose à essayer, nous avons eu des problèmes similaires (et les autres aussi) et ils sont allés loin lorsque nous avons mis à jour de Java pour la mise à jour 27. Dernière mise à jour 29 mais nous avons eu quelques problèmes avec elle.
Oui, les journaux montrent une PSPermGen de autour de ~64 MO, qui je pense est le total en charge la taille de la classe: JVM, tomcat, de bibliothèques et de mon application. Droit?
OK, va mise à jour de la JVM. Merci.
OriginalL'auteur massimogentilini