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 de totalMemory 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 est totalMemory pas correct?
  • Vous devriez demander à MattB à ce sujet.

InformationsquelleAutor Matt | 2013-06-28