Java alloue 2 Go de mémoire supplémentaires


J'ai un nouveau VPS pour exécuter des programmes java que moi et certains copains avons créés. Je commence le processus avec une ligne comme celle-ci:

java -Xmx512M -jar program.jar

Sur nos anciens VPS, vous pouvez utiliser la commande 'top' pour voir la quantité de mémoire virtuelle et résidente utilisée. Il utiliserait comme 600-700mb de mémoire virtuelle. Maintenant, sur notre nouveau VPS, avec cette même commande, la mémoire virtuelle semble toujours être un ~2gb supplémentaire par rapport à la valeur-Xmx. Donc, au lieu que la mémoire virtuelle soit autour de 600-700mb, c'est à la place 2700-3000mb.

L'ancien VPS exécute CentOS 5.7 et le nouveau exécute CentOS 6.2. Les deux exécutent JRE 1.7u3 64bit.

Pourquoi est-ce et comment puis-je le réparer?

Modifier: haut

PID   USER    PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
27645 pyro    20   0 3003m 270m  10m S  5.0  1.7   1:19.18 java -Xmx512M -jar cserver.jar

Une autre édition: Je ne me demande pas pourquoi la mémoire virtuelle utilise plus de mémoire que spécifié dans la ligne de commande java. Je me demande pourquoi il utilise tellement plus qu'avant.

Author: Reed D., 2012-03-12

2 answers

Le tas n'est pas la seule chose qui consomme de la mémoire virtuelle. La mémoire virtuelle est la quantité d'espace d'adressage de l'application est plutôt que la quantité de mémoire qu'il utilise (le résident est un meilleur indicateur)

La mémoire virtuelle comprend tout l'espace de la pile de threads, la mémoire directe et les fichiers mappés en mémoire.

La première chose que je vérifierais est le nombre de threads que votre application utilise, plus il y a de threads, plus il y a de mémoire virtuelle.

 4
Author: Peter Lawrey, 2012-03-12 08:20:54

L'utilisation de la mémoire virtuelle signifie la quantité d'espace d'adressage utilisée et ne se traduit pas nécessairement directement en utilisation de la RAM. Pile, fichiers mappés (y compris les binaires et les bibliothèques), etc. tous contribuent à la mémoire virtuelle mais pas toujours à la RAM réellement utilisée. Notez que votre utilisation de la mémoire RES (résidente en RAM) est plutôt agréable de 270 Mo seulement. Sur une machine 32 bits, vous pouvez rencontrer des limitations d'espace d'adressage, de sorte que la mémoire virtuelle est une ressource rare si vous vous approchez de la marque 2 Go (la valeur peut soit également 1 Go ou 3 Go selon le système d'exploitation). Sur un système 64 bits, la mémoire virtuelle (espace d'adressage) est presque illimitée, donc en soi, une valeur élevée n'a pas besoin d'être traitée comme un risque. Bien sûr, si cela est également lié à une utilisation réelle de la RAM élevée ou à de nombreux fichiers mappés dont vous ne pouvez pas savoir pourquoi ils sont utilisés, cela vaut la peine d'être examiné.

Bien sûr, la JVM a également une surcharge réelle (dans la mémoire physiquement allouée), liée à la conservation de la maison du garbage collector, au travail du compilateur, au code natif, etc. et ce sera également reflété dans l'utilisation de la mémoire virtuelle. Mais comme les positions RES et SHR ne sont pas très élevées, je dirais qu'il n'y a aucune raison de paniquer, surtout si vous êtes 64 bits.

 1
Author: Michał Kosmulski, 2012-03-12 08:29:43