D'autres ont fourni des suggestions sur la façon de surveiller l'utilisation de la mémoire ...
Supposons que j'ai deux serveurs d'applications Tomcat en production, l'équilibre de charge configuré derrière eux. Si je peux voir les statistiques de la mémoire jvm, je peux dire à l'équilibre de charge d'arrêter d'envoyer la demande au serveur qui rencontrera un problème de MOO. Est-ce que cela a du sens?
Sorte de. Mais ce n'est pas nécessairement la meilleure façon de résoudre votre problème.
Permet de revenir à la racine du problème ... les OOME. Dans le contexte de Tomcat, les OOME sont susceptibles d'être causés par l'un des éléments suivants:
- fuites de mémoire dans votre application (ou peut-être Tomcat lui-même),
- tenter de traiter trop de demandes en parallèle sur chaque Tomcat, ou
- demandes individuelles qui nécessitent trop de mémoire pendant le traitement.
Pour résoudre votre problème, vous devez d'abord savoir lequel se produit ... car la solution est différente pour chacun d'eux.
1) Pour voir s'il s'agit d'une fuite de mémoire, vous devez utiliser un outil d'analyse de mémoire pour examiner les modèles d'utilisation de la mémoire à long terme. Cela montrera probablement un motif en dents de scie ... ce qui est normal. Ce que vous devez rechercher, c'est le niveau du bas des "dents" qui tend vers le haut au fil du temps. Cela indique que quelque chose crée des déchets qui ne peuvent pas être collectés; c'est-à-dire une fuite de mémoire.
Si vous avez une fuite de mémoire, la meilleure solution consiste à déterminer quelle partie de votre code est responsable et à la corriger. Tout le reste ... y compris l'équilibrage de la charge ... est une solution bandaid et pourrait entraîner des problèmes plus graves en cours de route.
2) Après avoir éliminé les fuites de mémoire, vous devez déterminer si le problème est que vous traitez trop de demandes à la fois. Je ne suis pas sûr de la meilleure façon de le faire, mais si tel est le problème (ou si vous le soupçonnez), il existe quelques solutions possibles:
Ajustez la configuration du serveur Tomcat pour réduire le nombre de threads de travail.
Si vos demandes sont liées aux E / S, une autre possibilité serait d'examiner la prise en charge de la gestion des demandes asynchrones disponible dans les versions récentes de la spécification Servlet - voir http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm . Mais ce sera plus de travail.
3) Si le problème s'avère être que certaines requêtes utilisent trop de mémoire, alors vous devez comprendre comment détecter ces requêtes à l'avance et "les traiter". La détection et le traitement de ces demandes pourraient être difficiles ... et il est difficile de conseiller sans détails sur votre demande. Mais quelques solutions pragmatiques sont:
Transférer les requêtes anormales à un autre serveur avec un gros tas ... où les OOME n'interfèrent pas avec les requêtes "normales".
Augmentez la taille du tas. Si vous avez suffisamment de mémoire physique, une exécution avec un segment de mémoire plus important pourrait en fait rendre vos serveurs Tomcat plus efficaces ... et éviter les OOME.
En résumé, plutôt en essayant d'équilibrer la charge pour éviter les OOME, je vous suggère de comprendre pourquoi vous obtenez des OOME ... et d'essayer de traiter directement la cause des OOME.