Diverses consommation de mémoire avec des configurations similaires

J'ai deux instances différentes tomcat 7 sur deux serveurs différents (oracle jdk7) avec presque la même configuration d'équipement (Les deux> 24 Gb de bélier). Les deux serveurs tomcat Avoir la même configuration et les mêmes applications Web sont déployées sur ces serveurs. Catalina Offre les options suivantes:


-XX:PermSize=128m -XX:MaxPermSize=512M -Xmx2048m -XX:+CMSIncrementalMode -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC

Lors du lancement d'un test de charge (Chargement REST API avec des demandes parallèles sévères) Un des serveurs donne

java.lang.OutOfMemoryError: Java heap space

(Voici une pile de traces:
http://pastebin.com/wuS1MVCC
), Un autre serveur fonctionne bien. Je ne sais pas pourquoi cela se produit. Quelqu'un a-t-il rencontré un problème similaire?
Invité:

Blanche

Confirmation de:

Alors, que se passe-t-il est celui de votre JVM Tomcat essayer de dépasser la taille du tas 2048 MB alloué pour cela.

On dirait que vous recherchez une réponse spécifique, et non seulement une liste de contrôle des choses dont vous avez besoin pour essayer, de l'avant:

L'épuisement des tas se produit soit en raison de la fuite de mémoire lorsqu'une petite fuite se produit avec chaque requête ou dans le scénario de téléchargement, cela peut être dû au fait que vous venez de jeter JVM Plus que cela ne peut traiter. Vous voulez déterminer quel est le problème, alors commencez par la prise en compte de la manière dont vous générez votre charge.

Si le problème ne survient que à un niveau élevé de requêtes parallèles, mais jamais à un niveau inférieur, le problème est que le nombre de demandes multipliées par la quantité de mémoire requise pour le traitement de chaque demande est trop grande. Vous devez soit forcer chaque demande d'utiliser moins de mémoire, soit en quelque sorte limiter le parallélisme.

Si le problème survient après le traitement d'un certain nombre de requêtes, quel que soit le parallélisme, vous avez une fuite de mémoire. Vous devez le trouver et renvoyer la mémoire.

En tout cas, vous aiderez très bien un bon tas d'analyseur de mémoire. Il y a de bonnes commerciales, telles que YourKit Java Profiler, ou libre, par exemple, Eclipse Memory Analyzer. Trouvez un outil qui vous convient et découvrez comment l'utiliser pour découvrir quelle est la mémoire. Veuillez noter que vous n'avez pas besoin d'utiliser l'outil pour exécuter votre programme. - Si vous exécutez le test de charge sur le serveur, vous pouvez utiliser l'outil de ligne de commande. jmap de JDK Pour capturer un tas de vidanges dans un fichier, puis utilisez votre outil pour analyser le fichier de vidage. L'outil vous montrera quels objets occupent une place dans votre pile.

Blanche

Confirmation de:

Il y a

quelque chose

Différent entre deux systèmes, sinon le comportement ne changerait pas. Veuillez noter que trop de temps passé dans l'assemblage des ordures et trop peu de résultat peut également provoquer une erreur. Travailler près des limites du tas conduit à des problèmes avec GC.

Collection excessive de déchets et d'erreurs OutOfMemoryError

Le collecteur parallèle émettra OutOfMemoryError, Si trop de temps est dépensé sur l'assemblage des ordures: si la collection à la poubelle part plus 98% Temps total et restauré moins 2% Tas, sera jeté OutOfMemoryError. Cette fonctionnalité est conçue pour empêcher que l'application commence sur une longue période de progrès insignifiante ou l'absence de progrès due à des tas de trop petits. Si nécessaire, cette fonctionnalité peut être désactivée en ajoutant le paramètre -XX: -UseGCOverheadLimit sur la ligne de commande.

Pour répondre aux questions, connectez-vous ou registre