Consommation de mémoire JVM

9

J'essaye d'exécuter tomcat sur un système à faible mémoire (150-256Mb). Même si je démarre la JVM avec -Xmx64m (qui devrait être la valeur par défaut de toute façon), le processus prend immédiatement 200 Mo +.

Je me demande pourquoi la JVM a besoin de tant de mémoire elle-même, ou s'il existe un moyen de régler cela? Les autres machines virtuelles Java sont-elles meilleures que celles du soleil pour une faible consommation de mémoire - et fonctionnent-elles avec tomcat?

Draemon
la source

Réponses:

5

En plus du tas (spécifié par -Xmset -Xmx), vous devez inclure les zones non tas. Ceux-ci inclus

  • Le Perm Gen, qui est de 64 Mo sur les systèmes 32 bits, et de 96 Mo sur les systèmes 64 bits initialement
  • Le cache de code, qui est compris entre 20 et 40 Mo selon JVM
  • La zone tampon NIO (d'où DirectByteBufferproviennent les s), elle est initialement de 64 Mo

Il y a aussi l'espace de travail de la JVM elle-même qui fera quelques dizaines de mb.

Vous devez également être conscient du dimensionnement automatique de la JVM Sun lorsque vous utilisez une machine de classe serveur . Au fil du temps, la définition de la classe de serveur (mémoire 2 Go, plus d'un cœur) a subi une certaine dépréciation et maintenant la plupart des machines sont capables de déclencher les -serveroptimisations. Mon conseil est toujours de préciser les -Xmset les -Xmxparamètres et passer à -servermoins que vous pouvez penser à une bonne raison de ne pas trop.

Dave Cheney
la source
Méfiez-vous également de la mémoire virtuelle que la JVM se réserve uniquement et qu'elle n'utilise pas encore.
Steve Schnepp
Certes, la plupart de ces segments, comme PermGen et le cache de code, sont alloués au démarrage, mais la plupart des noyaux éviteront d'allouer des pages à ces segments jusqu'à ce qu'ils soient nécessaires.
Dave Cheney
1
Merci pour l'info - je pense que cela explique où va la mémoire. Existe-t-il un moyen de modifier ces valeurs? Encore mieux serait un moyen de voir combien de chaque section était utilisée - je ne sais pas si l'un des outils de débogage / surveillance Java vous permet de le faire?
Draemon
1
Vous pouvez utiliser pmap ou jmap pour vous faire une idée des différents segments utilisés. La plupart des options courantes (et leurs valeurs par défaut) sont répertoriées ici, java.sun.com/javase/technologies/hotspot/vmoptions.jsp . Ils changent souvent et sont sujets à des différences de système d'exploitation (taille de pile généralement) et d'arc (les systèmes d'exploitation 64 bits impliquent généralement des zones JVM plus importantes)
Dave Cheney
3

Avec l'option -Xmx, vous limitez la taille du tas que la JVM réserve ... Il y a des ressources supplémentaires dont la JVM a besoin ...

"Merci pour la mémoire" * est un bon article qui explique comment une machine virtuelle Java utilise la mémoire ...

En dehors de cela, vous pouvez essayer la JVM d'IBM, cela devrait fonctionner avec Tomcat, je ne sais pas si certaines des implémentations JVM gratuites fonctionnent.

Néanmoins, je ne pense pas qu'une machine avec une mémoire aussi basse vous fera du bien. Java a juste besoin de mémoire.

* Comme les nouveaux utilisateurs ne peuvent pas soumettre d'hyperliens, vous devez rechercher cet article vous-même ... c'est le premier hit sur google pour "merci pour la mémoire ibm".

dertoni
la source
3
ibm.com/developerworks/java/library/j-nativememory-linux - Lien vers l'article "Merci pour la mémoire"
StackKrish
0

Une technique utile que j'ai trouvée consiste à utiliser la surveillance JMX pour voir exactement combien de mémoire est utilisée par l'espace tas vs permgen.

Configurez JMX dans Tomcat comme décrit ici http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

Ensuite, utilisez JConsole (livré avec JDK 5 ou JDK 6) - la balise de mémoire suivra la consommation de mémoire au fil du temps.

Aussi - méfiez-vous des redémarrages en douceur des applications Web. Si vous rechargez une webapp, l'espace permgen ne sera pas récupéré et s'accumulera avec le temps. Vous devez faire un arrêt / démarrage complet de Tomcat afin de récupérer l'espace permgen.

Will Glass
la source
VisualVM peut également être utilisé à la place de JConsole et donne encore plus de détails lors de la recherche de problèmes de mémoire dans la JVM. J'ai dû l'utiliser à plusieurs reprises pour trouver des problèmes.
Jeremy Bouse