2011-09-11 2 views
8

Je vous écris un programme de test comme suit:L'élimination d'une JFrame provoque-t-elle une fuite de mémoire?

  1. Lorsqu'un utilisateur clique sur le bouton A, il ouvre 50 JFrames.
  2. Lorsque l'utilisateur clique sur le bouton B, il est équipé de tout JFrames affichés en cliquant sur le bouton A.

Je trouve que la mémoire ne diminue pas après cliquant sur le bouton B. Je résolus donc en utilisant le Gestionnaire des tâches, ctrl +alt + del dans Windows, et de vérifier l'utilisation de la mémoire de "java".

+0

Un code va nous aider définitivement ... –

+1

Voir [Supprimer conteneur de niveau supérieur sur Runtime] (http://stackoverflow.com/questions/6309407/remove-top-level-container-on-runtime/6310284# 6310284). – trashgod

+1

Mon code n'a rien de spécial. Création de JFrame par le nouveau JFrame. Éliminer en appelant dispose() – Bear

Répondre

11

C'est vrai, aucun moyen, pas en mesure de résoudre ce (non seulement en Java PL),

1) vraiment ne créent pas beaucoup de Top-Level Containers sur Runtime/Fly, parce qu'ils ne sont jamais mis au point, et jusqu'à ce que l'instance de machine virtuelle Java actuelle sortie et ces objets jamais été GC'ed seulement leur Grapfics2D

2) myContainer#dispose() sur Runtime est même, par exemple de machine virtuelle Java actuelle comme myContainer#setVisible(false) connexions avec machine virtuelle Java disponible et utilisé Mémoire

3) créer seulement quelques Top-Level Containers (maximum affichées simultanément), la réutilisation, mais mis là JPanel comme 1.st JComponent et appellent myPanel#removeAll(), sinon vous allez supprimer RootPane et de votre conteneur reste seulement Borders :-) serait translucide

4) Partialy est possible de réduire la mémoire machine virtuelle Java utilisée par appel GC, mais juste returs quantité de Graphics2D et Garbage ne fonctionne pas immediatelly,

5) plus here infos utiles here

+0

thx beaucoup. Mais je ne comprends pas la suggestion 3. – Bear

+0

btw, Java sait-il le problème? – Bear

+0

@Bear vous avez deux choises 1) créer trois - quatre conteneurs de niveau supérieur, 1er. serait JFrame autre JDialog (avec Modalité aussi) ou JWindow, 2) ou chercher CardLayout http://download.oracle.com/javase/tutorial/uiswing/layout/card.html et ensuite passer deux cartes au lieu de créer Top- Conteneurs de niveau :-) – mKorbel

2

Sans le moindre code, nous ne pouvons pas vous aider beaucoup ... vous appelez jFrame. dispose()?

Éliminez public void()

Libère toutes les ressources d'écran natif utilisées par cette fenêtre, ses sous-composants, et tous ses enfants appartenant. Que est, les ressources pour ces composants seront détruites, toute mémoire qu'ils consomment sera retournée à l'OS, et ils seront marqués comme indisponible.

Plus d'informations disponibles here

0

S'il existe une référence forte à la racine GC (garbage collector) de votre cadre, alors si vous appelez la méthode d'élimination, elle ne récupère pas les ordures, donc vous ne pouvez voir aucun changement de mémoire après avoir éliminé les cadres. Si vous voulez de la mémoire, à partir de choses que vous devriez publier, vous devez ramasser les images.