154 votes

Quelle est la signification exacte de Runtime.getRuntime().totalMemory() et freeMemory() ?

Je me demandais toujours la signification exacte du retour de Runtime.getRuntime().totalMemory(), Runtime.getRuntime().freeMemory() et Runtime.getRuntime().maxMemory().

Je crois savoir, Runtime.getRuntime().totalMemory() retourne la mémoire totale mon processus utilise. Est-ce exact ? Que diriez-vous freeMemory() et maxMemory() ?

Merci.

247voto

cheneym Points 636

Les noms et les valeurs sont source de confusion. Si vous êtes à la recherche pour le total de mémoire libre , vous aurez à calculer cette valeur en soi. Ce n'est pas ce que vous obtenez à partir d' freeMemory();.

Consultez le guide suivant:

Total désigné en mémoire, ce sera égale à la valeur configurée de -Xmx valeur:

Moment de l'exécution.getRuntime().maxMemory();

Actuellement alloué de la mémoire libre, est l'actuel espace alloué prêt pour de nouveaux objets. Attention ce n'est pas le total de la libre disposition de la mémoire:

Moment de l'exécution.getRuntime().freeMemory();

Total alloué de la mémoire, est le total alloué à l'espace réservé pour le processus java:

Moment de l'exécution.getRuntime().totalMemory();

La mémoire utilisée, doit être calculée:

usedMemory = Runtime.getRuntime().totalMemory() - temps d'Exécution.getRuntime().freeMemory();

Total de la mémoire libre, doit être calculée:

freeMemory = Runtime.getRuntime().maxMemory() - usedMemory;

Une image peut aider à clarifier:

java runtime memory

203voto

Amir Afghani Points 17519

Selon l' API

totalMemory()

Renvoie le montant total de la mémoire dans la machine virtuelle Java. La valeur retournée par cette méthode peuvent varier au fil du temps, en fonction de l'environnement d'accueil. Notez que la quantité de mémoire nécessaire pour tenir un objet d'un type donné peut être dépendant de l'implémentation.

maxMemory()

Retourne la quantité maximale de mémoire que la machine virtuelle Java tente d'utiliser. Si il n'y a pas de limite inhérente alors la valeur de Long.MAX_VALUE sera retourné.

freeMemory()

Retourne la quantité de mémoire libre dans la Machine Virtuelle Java. L'appel de la méthode gc peut entraîner une augmentation de la valeur retournée par freeMemory.

En référence à votre question, maxMemory() renvoie l' -Xmx de la valeur.

Vous demandez peut-être pourquoi il y a un totalMemory() ET un maxMemory(). La réponse est que la JVM alloue de la mémoire paresseusement. Disons que vous commencez votre processus Java en tant que tel:

java -Xms64m -Xmx1024m Foo

Votre processus commence avec 64 mo de mémoire, et si et quand elle a besoin de plus (jusqu'à 1024m), il va allouer de la mémoire. totalMemory() correspond à la quantité de mémoire actuellement disponible à la JVM pour les Foo. Si la JVM a besoin de plus de mémoire, il paresseusement allouer jusqu' à la quantité maximale de mémoire. Si vous exécutez avec -Xms1024m -Xmx1024m, la valeur que vous obtenez à partir d' totalMemory() et maxMemory() seront égaux.

Aussi, si vous voulez calculer avec précision le montant utilisé de la mémoire, vous le faites avec le calcul suivant :

final long usedMem = totalMemory() - freeMemory();

13voto

Sriram Points 897

Pour mieux comprendre, exécuter ce programme suivant (en jdk1.7.x) :

Cet exemple affiche options de jvm et l’utilisé, libre, total et maximale de mémoire disponible dans la machine virtuelle Java.

7voto

Tim Bender Points 11611

Runtime#de la mémoire - la mémoire de la JVM a alloué jusqu'à présent. Ce n'est pas forcément ce qui est en cours d'utilisation ou le maximum.

Runtime#maxMemory - la quantité maximale de mémoire que la JVM a été configuré pour utiliser. Une fois votre processus atteint ce montant, la JVM ne sera pas allouer plus de et plutôt GC beaucoup plus fréquemment.

Runtime#freeMemory - je ne sais pas si c'est mesurée à partir de la valeur maximale ou la partie du total inutilisé. Je devine que c'est une mesure de la proportion du total de ce qui est inutilisé.

6voto

ALam-Kim Points 41

Taille de segment JVM peut être cultivables et rétractable par la Poubelle-mécanisme de Collecte. Mais, il ne peut pas allouer plus de mémoire maximale de taille: le temps d'Exécution.maxMemory. C'est le sens de la mémoire maximale. Total de la mémoire de la répartition de la taille de segment de mémoire. La mémoire libre et les moyens disponibles de la taille totale de la mémoire.

exemple) java -Xms20M -Xmn10M -Xmx50M ~~~. Cela signifie que la jvm doit allouer des tas de 20M sur démarrer(en ms). Dans ce cas, la mémoire totale est de 20M. libérer de la mémoire est de 20M-taille utilisée. Si plus de segment de mémoire est nécessaire, JVM allouer plus, mais ne peut pas plus de 50M(mx). Dans le cas du maximum, de mémoire totale de 50 m, et la taille libre, 50M-taille utilisée. Comme pour minumum de taille(mn), si le tas n'est pas beaucoup utilisé, jvm pouvez réduire la taille du segment de 10M.

Ce mécanisme est l'efficacité de la mémoire. Si petit programme java à exécuter sur d'énormes fixe la taille de segment de mémoire, une grande quantité de mémoire peut être un gaspillage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X