9
votes

Mon application est constamment en cours d'exécution complète GC!

Je suis un débutant dans les applications de réglage de la performance et je tiens à déterminer le fonctionnement de la GC afin de poser probablement la même question un millionième temps!

Le problème est que 2 à 3 semaines, quelque part, mon application Web a commencé à se planter de temps en temps. puis. En regardant les bûches, il a été déduit que sa crash due à des erreurs OOM: p> xxx pré>

et p> xxx pré>

ultérieurement, je Commencé à enregistrer des journaux GC et a constaté que initialement le démarrage du serveur, GC fonctionne bien: P>

java -Dprogram.name=run.sh -server -Xms256m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m -verbose:gc -Xloggc:/data1/logs/jboss/GC.log -XX:+HeapDumpOnOutOfMemoryError -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=false -Djava.net.preferIPv4Stack=true -Djava.library.path=/usr/local/java/jboss-4.2.2.GA/bin/native -Djava.endorsed.dirs=/usr/local/java/jboss-4.2.2.GA/lib/endorsed -classpath /usr/local/java/jboss-4.2.2.GA/bin/run.jar:/usr/local/java/jdk1.6.0_06/lib/tools.jar org.jboss.Main -c default -b <IP_ADDRESS> -Djboss.messaging.ServerPeerID=1


9 commentaires

+1 pour une question bien écrite.


@Sumit au lieu des journaux GC, publiez le code hibernate.


Cela ne résoudra probablement pas votre problème, mais votre JDK est dans Dire besoin d'une mise à niveau!


@Sumit: Veuillez joindre le rapport de bogues bugs.mysql.com/bug.php? id = 36565


@Suresh: Pourquoi pensez-vous que cela est lié? Le rapport de bogue concerne un problème qui se produit lors du déchargement / de rechargement des applications à Tomcat. Je ne vois aucune mention de cela se produire dans cette question.


@ Jochim: Je cherchais la vidée thread "MySQL Déclaration de la minuterie d'annulation en attente (sur moniteur d'objet)".


@Suresh: Eh bien, le fait que ce fil est en cours d'exécution n'est pas un signe qu'il a vu ce bogue en action. En fait, c'est normal.


@ Jochim: Ok merci pour l'info.


@SURSH @JOCHIM: Il existe 2 WebApps servies par cet exemple particulier de JBoss (interne WebApp & jorum) et tous les déploiements sont gérées par une fermeture / redémarrage correcte du serveur JBoss. Ainsi, il ne devrait pas y avoir de déchargement / rechargement sale de modules Web, sauf étant automatiquement effectué par JBoss (y est-il en est !!).


3 Réponses :


3
votes

Eclipse comprend un excellent outil appelé Analyseur de mémoire. Il peut analyser exactement ces décharges de tas que vous générez sur OOM. Il attire de très bons graphiques pour vous aider à réduire l'emplacement de la consommation de votre mémoire: votre application, JBoss, d'autres parties de votre configuration - jusqu'à un niveau très fine.

Si vous collez sa sortie ici, nous pourrions continuer à enquêter sur votre problème.


2 commentaires

Merci pour la réponse rapide. Je vais installer des sorties de tapis et post. Entre-temps, affichez également une décharge de tas de JBoss, tandis que les GC complètes se produisaient.


D'accord, le tapis est incroyablement utile si vous avez un dépotoir de tas.



0
votes
Somewhere your code is creating temporary objects in an memory- less environment.
Please look at your code (HibernateCommentaryDao.java) 

it is something with n+1 fetch
Excessive GC Time and OutOfMemoryError
  The parallel collector will throw an
  OutOfMemoryError if too much time is
  being spent in garbage collection: if
  more than 98% of the total time is
  spent in garbage collection and less
  than 2% of the heap is recovered, an
  OutOfMemoryError will be thrown. This
  feature is designed to prevent
  applications from running for an
  extended period of time while making
  little or no progress because the heap
  is too small. If necessary, this
  feature can be disabled by adding the
  option -XX:-UseGCOverheadLimit to the
  command line

1 commentaires

Merci d'avoir examiné cela. Ajout du code en question comme vous l'avez demandé (le code désolé trop longtemps, ne pouviez pas publier ici!)



3
votes

en cours d'exécution avec 4 Go de RAM et en utilisant -xmx1024m (quantité maximale de java tas de 1024 m) pourrait ne pas être intentionnel.

D'autre part, il me semble que votre requête retourne trop de résultats Soit en raison des jointures ou de la limite null , qui se transforme en une liste surdimensionnée.

Vous pouvez commencer par prendre un instantané de tas au milieu de GCS avec < Pré> xxx

puis à l'aide de analyseur de mémoire .


5 commentaires

Merci pour l'information, vérifiera cette sortie et la mise à jour. En outre, je ne sais pas ce que vous vouliez dire par en cours d'exécution avec 4 Go de RAM et à l'aide de -xmx1024m (quantité maximale de 024m Java 1024m) pourrait ne pas être intentionnel . J'ai intentionnellement ajouté les drapeaux -xms et -xmx pour exécuter JBoss.


@Sumit: Je voulais dire que - si vous n'exécutez rien d'autre sur ce serveur - vous pouvez attribuer plus de mémoire à la JVM, car les autres 3 Go restera assis là-bas de ne rien faire pratiquement rien. Si le serveur exécute d'autres choses, alors c'est parfaitement bien.


Merci pour la clarification. Oui, le serveur a d'autres applications qui l'utilisent !!


Le serveur vient de se redémarrer alors GC Retour à la normale pour le moment (GC complet survenant rarement). J'ai pris un instantané de tas en utilisant votre commande et j'ai trouvé des objets potentiellement problématiques. Prendra un autre instantané lorsque des GC complètes réguliers se produisent pour confirmer ces objets et posteront le code des suggestions de solution.


Problème identifié. Ouvrira une question séparée demandant la solution. Marquant cette réponse comme la bonne réponse en tant que MAT a aidé beaucoup à identifier le problème. Merci tout le monde!