2013-08-28 2 views
0

J'ai écrit ce programme de test.
Simple programme CLI Java continue à manger de plus en plus de mémoire

import java.io.Console; 

public class ConsoleTest{ 

public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Console console = System.console(); 
     System.out.println("ConsoleTest initialising... \n Enter command : "); 
     String line = ""; 

     if(console!=null){ 
      while ((line = console.readLine())!= null){ 
       System.gc(); 
       System.out.println("your input : " + line); 

       if("exit".equalsIgnoreCase(line)){ 
        System.out.println("Bye ~");      
        System.exit(0); 
       }else{ 
        System.out.println("Enter command : "); 
       } 

      } 
     }else{ 
      System.out.println("No console found"); 
     } 


    } 
} 



enter image description here
je vis l'utilisation de la mémoire tas constamment en remontant même pendant que je rédigeais cette question, ne faisant rien au programme.
Aussi, chaque fois que je clique sur le bouton Exécuter GC, le gestionnaire de tâches Windows montre que le programme utilise un peu plus de mémoire.
Y at-il un problème avec le code? ou est-ce un comportement normal?



EDIT
Plus tard, je trouve que le graphe d'utilisation du tas de mémoire a oscillé régulièrement sur une échelle de temps plus longue.
Je ne sais pas pourquoi ça fait ça mais c'est une autre affaire je suppose.
Si je pouvais demander une chose de plus, j'ai vu une énorme différence entre l'utilisation du tas dans Java Monitor et l'utilisation de la mémoire affichée dans le gestionnaire de tâches Windows.
L'utilisation du tas dans Java Monitor a montré environ 300 Mo pour le processus Eclipse.
Dans Windows taskmanager, 900 Mo - ish.
Est-ce la différence, car l'utilisation du tas n'incluait pas l'utilisation de la mémoire de la pile?

Répondre

1

La quantité de mémoire dont vous parlez est négligeable. La JVM ne se soucie pas de libérer la petite quantité. Si vous voulez voir un comportement plus intéressant, allouer puis laisser tomber les références aux gros blocs avant de demander la récupération de place.

+0

accordé, que la quantité de mémoire dont je parle est négligeable.Cependant, pourquoi utilise-t-il plus de mémoire? Même pendant que je ne demandais pas au MV de faire GC. Bien sûr, si la VM fait réellement GC ou non est à la pensée de la VM. – Ascendant

+2

Pas moyen de le dire sans plus de détails. Peut-être en profite-t-il pour déplacer des articles dans PermGen et laisser le reste du tas de la même taille. – chrylis

1

J'ai vu l'utilisation de la mémoire de tas augmenter constamment même pendant que j'écrivais cette question, ne faisant rien au programme.

Il est très probable que l'agent de surveillance provoque cette augmentation spontanée de l'utilisation de la mémoire. En d'autres termes, il est causée par votre surveillance.

De plus, chaque fois que je clique sur le bouton Perform GC, le gestionnaire de tâches Windows montre que le programme utilise un peu plus de mémoire.

C'est peut-être le même problème. D'autres possibilités sont:

  • cliquant sur le bouton GC ne recueille pas tous les tas, et/ou
  • le GC n'est pas redonner la mémoire au système de récupération d'exploitation.

Y at-il un problème avec le code? ou est-ce un comportement normal?

Ceci est un comportement normal.

La seule chose qui ne va pas avec votre code est qu'il appelle System.gc(). C'est une mauvaise idée dans la plupart des cas.

Questions connexes