2014-05-06 2 views
0

J'ai fait une application et j'ai suivi son utilisation de la mémoire. La mémoire de l'application est d'environ 58 676 K comme indiqué ci-dessous. enter image description hereJava signes de fuite de mémoire

Ceci est mon interface graphique.

enter image description here

Ce bouton de fermeture, il a une fonction qui rend ce panneau non visible.

private final ActionListener closeButtonAL = new ActionListener(){ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     timeUtilities.getPanel().setVisible(false); 
    } 

}; 

J'ai également un bouton qui rend le panneau visible à nouveau.

private final ActionListener showPanelAL = new ActionListener(){ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     timeUtilities.getPanel().setVisible(true); 
    } 

}; 

Le panneau a déjà été initialisé avant le lancement de l'application.

Mon problème est que, en faisant simplement apparaître l'interface graphique et en la fermant, cela augmente encore et encore l'utilisation de la mémoire de l'application.

N'est-ce pas une sorte de fuite de mémoire? Indépendamment de la réponse, comment puis-je empêcher cette affaire?

enter image description here

+0

Avez-vous essayé de le faire avec un profiler? Cela vous dira facilement ce qui ne va pas. –

+0

@AnubianNoob Je ne sais pas à propos de cette chose profiler, pouvez-vous expliquer brièvement où et comment puis-je accéder à cela? Ou qu'est-ce que ça fait? – xchan

+0

Quel IDE utilisez-vous? –

Répondre

1

Vous devez utiliser un profileur pour localiser votre fuite de mémoire.

Dans NetBeans, en haut à côté des boutons "Exécuter le projet" et "Déboguer le projet" se trouve un bouton "Profil du projet" (Alt-F2).

Première exécution, il peut vous demander de calibrer ou quelque chose. Afterwars, vous pouvez choisir d'analyser la CPU ou la mémoire. Si vous cliquez sur Mémoire, cochez "Simple", et cliquez sur Exécuter, vous pouvez exécuter votre projet et voir ce qui utilise la mémoire.

+1

J'ai été capable de réduire jusqu'à 5 millions d'octets de Int [] en le suivant avec un profileur. Pour ceux qui ont le même problème, mettre à l'échelle une image en utilisant getScaledInstance prend beaucoup de mémoire, istead dessiner l'image en utilisant bufferedImage et Graphics2D :) merci! – xchan

+0

Génial, heureux je pourrais aider :). Le profilage/débogage est une bonne compétence à avoir. –

1

Non, ce ne peut être un signe de fuite de mémoire. Parce que lorsque vous fermez et ouvrez l'interface graphique plusieurs fois, votre application peut créer et supprimer certains objets. Mais la JVM n'a peut-être pas encore collecté les ordures. Si vous voulez l'image réelle, utilisez un outil de profilage. Prenez des vidages de tas au fil du temps après l'exécution du GC. Cela vous dira ce qui reste dans la mémoire.

Cela peut vous aider à affiner votre recherche d'une éventuelle fuite de mémoire.

Outils les plus simples à profiler.

  1. Netbeans est livré avec un profileur intégré.
  2. Jconsole peut également aider un peu
  3. VisualVm peut également aider un peu.

Also see this link how to analyze heapdumps