Comment puis-je obtenir la mémoire que mon programme Java utilise via Java Runtime api?
Il y a des questions similaires, mais ils semblent éviter de répondre à cette question en particulier. Comment puis-je obtenir de la mémoire mon programme Java utilise via Java Runtime api?
La réponse ici indique que je peux faire quelque chose comme ceci:
System.out.println("KB: " + (double) (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024);
Mais cela revient toujours au même nombre, quel que soit le programme que je ne. Par exemple, ci-dessous, j'ai un programme où, peu importe combien les chiffres que j'ai mis dans la carte, l'utilisation de la mémoire reste le même.
package memoryTest;
import java.util.HashMap;
import java.util.Map;
public class MemoryTest {
static Map<Integer, NewObject> map = new HashMap<Integer, NewObject>();
public static void main(String[] args){
System.out.println("KB: " + (double) (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024);
fillMemory(25);
System.out.println("KB: " + (double) (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024);
}
static int j=0;
public static void fillMemory(int i){
for(int k=0; k< 2000; k++)
map.put(j++, new NewObject());
}
public static class NewObject{
long i = 0L;
long j = 0L;
long k = 0L;
}
}
via cambecc méthode principale, la sortie est de:
3085, Total: 128516096, Gratuit: 127173744, Diff: 671120
173579, Total: 128516096, Gratuit: 110033976, Diff: 671128
335207, Total: 128516096, Gratuit: 92417792, Diff: 637544
672788, Total: 224198656, Gratuit: 159302960, Diff: 1221520
1171480, Total: 224198656, Gratuit: 106939136, Diff: 1221544
1489771, Total: 368377856, Gratuit: 227374816, Diff: 1212984
1998743, Total: 368377856, Gratuit: 182494408, Diff: 1212984
getRuntime().totalMemory()
se réfère à la quantité totale de mémoire disponible pour l'exécution de Java, pas de la quantité de mémoire disponible pour votre application en particulier.- Harvey, j'ai édité. La réponse fournie ne fonctionne pas pour moi pour une raison...
- Je l'ai rouvert, mais peut-être que vous m'avez mal compris.
getRuntime().totalMemory
ne va pas travailler pour ce que vous voulez faire. - Merci. Oui, je comprends. La réponse que j'ai mentionné ci-dessus semble indiquer qu'il le ferait.
System.out.println("Used Memory : " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) + " bytes");
-- bien que ce ne soit le retour de la mémoire utilisée par tous les processus java.- double possible de Quelle est la signification exacte de l'Exécution.getRuntime().totalMemory() et freeMemory()?
- Oui, nous le savons. Nous avons en fait besoin d'une solution qui fonctionne ici.
- Le nouveau programme que j'ai ajouté au-dessus de tests ce, à l'aide de ce que devrait être une variation de la quantité de mémoire, mais le résultat, peu importe l'argument est toujours le même.
- stackoverflow.com/a/239252/102937
- Merci. Je pense vraiment que c'est la même réponse que celle que j'ai la référence ci-dessus. Pas de question. À quelqu'un d'autre, vous pouvez exécuter mon programme ci-dessus pour voir que, peu importe combien vous remplissez la carte mémoire reste le même. Est-il possible de voir la quantité de mémoire un programme consomme?
- Essayer ma solution
- Avez-vous lu la question en premier?
- J'ai relu votre question, mais je ne pouvais pas penser à une solution. J'ai trouvé un article qui pourrait vous aider. Jetez un oeil à ma réponse
- Il n'est pas clair pour moi pourquoi ce n'est pas une double question.
- Regardez les titres des questions.
- veuillez voir ma réponse ci-dessous. Votre approche de la mesure de l'utilisation de la mémoire est correcte, mais vous devez prendre note de la différence entre la résolution et la précision de
freeMemory
. - Pour clarifier, pourquoi dites-vous
totalMemory
n'est pas d'aller travailler pour @MattB? En regardant cette question, comme il est actuellement libellé, @MattB veut mesurer l'utilisation de la mémoire de son programme Java en cours d'exécution sur une seule instance de la JVM. Pour ce scénario,totalMemory - freeMemory
est correct. Les résultats detotalMemory
ne sont pas affectés par d'autres JVM cas (par exemple, processus) en cours d'exécution sur la même machine. Et @MattB ne fait aucune mention des autres programmes en cours d'exécution à l'intérieur de la même JVM exemple que son programme. Comment esttotalMemory
pas correct? - Vous devriez demander à MattB à ce sujet.
Vous devez vous connecter pour publier un commentaire.
Vous le faites correctement. La manière d'obtenir l'utilisation de la mémoire est exactement comme vous l'avez décrit:
Mais la raison de votre programme renvoie toujours la même utilisation de la mémoire est parce que vous ne créez pas assez d'objets pour surmonter la précision des limites de la
freeMemory
méthode. Bien qu'il ait octet résolution, il n'y a aucune garantie pour combien de précisfreeMemory
doit être. La javadoc en dit autant:Essayez la suivante, ce qui crée deux millions
NewObject
cas, et imprime à chaque fois le résultat defreeMemory
changements:Sur ma machine, je vois la sortie comme suit
Avis comme l'a signalé libérer de la mémoire n'a pas changé jusqu'à ce que le 21,437 th objet est instancié? Les chiffres suggèrent
freeMemory
pour la JVM, je suis en utilisant (Java7 Win 64 bits), la précision est d'un peu plus de 2,5 MO (bien que si vous exécutez le test, vous verrez ce nombre varie).-- Edit --
Ce code est le même que ci-dessus, mais les tirages plus de détails sur l'utilisation de la mémoire. J'espère que c'est un peu mieux comment la JVM de l'utilisation de la mémoire se comporte. Sans cesse, nous allouer de nouveaux objets dans une boucle. Lors de chaque itération, si le
totalMemory
oufreeMemory
est le même que la dernière itération, nous n'avons pas d'imprimer quoi que ce soit. Mais si l'un a changé, nous avons un rapport actuel de l'utilisation de la mémoire. Le∆
valeurs représentent la différence entre l'utilisation actuelle et le mémoire précédent rapport.Sur mon portable, je vois la sortie suivante. Notez vos résultats seront différents selon le système d'exploitation, le matériel, la machine JVM, mise en œuvre, etc.:
Il y a quelques observations à partir de ces données:
totalMemory
, et 2) la collecte, l'augmentation defreeMemory
. Tous de très normal. Et il semble que votre JVM de ses changements de précision defreeMemory
selon... qui sait. De nouveau, le comportement est dans les spec.Diff
est pas la quantité de mémoire utilisée. C'est une mesure de la précision defreeMemory
, c'est à dire, la différence entre signalés précédemment, la quantité defreeMemory
et le courant de charge. Vous vous attendriez à ce qu'il reste assez constant, car il serait étrange pour la précision defreeMemory
de changer de manière chaotique.freeMemory
, et le bleu est la mémoire utilisée, et le haut de la ligne orange représentetotalMemory
. Remarquez comment libérer de la mémoire a tendance à augmenter (c'est à dire, la mémoire utilisée diminue) lorsque le tas croît en taille? Ce n'est pas une règle dure et rapide. Dans mon expérience, la GC a un comportement souvent mystérieusement complexe.freeMemory
est vous aider à voir la quantité de mémoire de votre programme utilise, mais vous devez garder à l'esprit les points suivants: 1) votre programme va générer en permanence des ordures, et jusqu'à ce que se produise un GC, cette poubelle compte comme de la mémoire utilisée. 2) La précision defreeMemory
ne fournit pas d'octet-par-octet de précision. En fait, le montant de la précision semble varier un peu juste (je me suis trompé à ce sujet d'être à peu près constante). Toutefois, le montant varie en est généralement assez petites par rapport à la totalité de la taille du segment.2_000_000
, c'est la première fois que j'ai vu le_
fonction utilisée et ne savais pas que c'était une choseJ'ai méthodes suivantes
qui retournent l' (utilisés par les) de la Mémoire en octets.
Si vous souhaitez recalculer à la MiB j'ai: