Question

Souvent, j'ai trouvé OutOfMemoryException sur IBM Websphere Application Server. Je pense que cette exception se produit parce que mon application récupère des données énormes de la base de données. Donc, je limite toutes les requêtes, ne récupère pas les données de plus de 1000 enregistrements et mets la JVM de WAS à jour

+ Verbose garbage collection
+ Maximum Heap size = 1024 (RAM on my server is 16 GB and now I already change to 8192)
+ Debug arguments = -Djava.compiler=NONE -Xdebug -Xnoagent  
                    -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7777
+ Generic JVM arguments = -Dsun.rmi.dgc.server.gcInterval=60000 
                          -Dsun.rmi.dgc.client.gcInterval=60000 -Xdisableexplicitgc  
                          -Dws.log=E:\WebApp\log -Dws.log.level=debug
(ws.log and ws.log.level are my properties)

Et j'ai trouvé des tas de données , des javacores et des clipsations dans le dossier Profils, je pense qu'ils peuvent m'indiquer la cause du problème, mais je ne le fais pas. t savoir comment lire / utiliser heapdump, javacore et snap files.

Dites-moi comment empêcher / éviter / réparer OutOfMemoryException. Merci

Était-ce utile?

La solution

La réponse à cette question dépend du message associé à l'exception OutOfMemoryException. Vous pouvez également essayer -XX: MaxPermSize = ... et le définir sur une taille supérieure à 256 m.

De plus, si vous avez une fonction récursive quelque part, cela peut provoquer un débordement de pile.

Si vous le pouvez, publiez le message associé à l'exception. Stacktrace pourrait aussi aider.

Autres conseils

Si vous souhaitez consulter les fichiers de tas, IBM propose des outils pour les analyser ici .

"Merci pour la mémoire" est un bon article sur l'utilisation de la mémoire par les machines virtuelles, ce qui pourrait aider à analyser ce problème ...

Merci à bwalliser pour ce lien

Essayez de reproduire le problème localement afin de pouvoir utiliser un outil tel que JProfiler pour le déboguer. Même si vous ne pouvez pas forcer un MOO localement, il est probable que vous constaterez une augmentation de la mémoire dans JProfiler. Ensuite, vous prenez des instantanés et recherchez des classes qui ne sont pas récupérées. Ce n'est pas une science exacte, mais c'est beaucoup plus facile que de regarder à travers un tas de choses IBM. Toutefois, si vous devez le faire, l'ancienne méthode consistant à examiner un vidage de tas était d'utiliser HeapRoots. Cela peut dépendre de la version que vous utilisez. Je sais que certaines versions du JDK IBM rencontrent des problèmes de compactage. Ainsi, même si vous disposez de beaucoup de mémoire, vous pouvez obtenir un MOO car le nombre de fragments disponible est insuffisant.

Je suppose que vous utilisez hibernate / JPA en tant que fournisseur de persistance? Utilisez-vous un cache de second niveau? Si tel est le cas, avez-vous envisagé d'expulser de grands ensembles de résultats du cache?

Il est difficile de répondre à la question si nous ne savons pas de quel type le type OutOfMemoryError est; permgen et heapspace sont deux bêtes très différentes.

Je recherchais une perm-gen depuis plusieurs mois sur JBoss, bien que ce type de problème soit courant pour tout serveur d’applications rechargeant des applications Web à la volée. La saga est documentée ici .

Ces tas de données que vous avez ... pourraient être que vous pouvez les analyser avec Eclipse MAT .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top