Une des fuites de mémoire que j'ai découvertes dans notre application est le Je ne comprends pas pourquoi cela est conçu de cette façon. Il semble contraire à l'esprit de la collecte des ordures pour avoir à laisser explicitement le système savoir quand j'aurai fini avec une fenêtre code> objet code>. Évidemment j'en ai fini avec elle, car il est hors de portée. P>
Je comprends ce que le Quelqu'un peut-il expliquer pourquoi cela est nécessaire? p> java.awt.window.allwindows code> site statique privé, qui garde une trace de chaque fenêtre
code> instancié. Nous avons des boîtes de dialogue créées, utilisées, et ensuite oubliées, et l'attente était que celles-ci disparaissaient et que celles-ci s'éloignaient et que celles-ci collectées. Ce champ privé les garde dans la portée, indéfiniment, jusqu'à ce que la méthode code> () code> soit appelée sur eux. Et par définition, nous ne pouvons pas faire cela quand ils sont sortis de portée. P>
Dispose () code> La méthode fait: se débarrasser des objets de pair système. Je comprends que cela est à l'extérieur de Java et que vous avez besoin d'une bonne façon de le faire et que ce swing ne devrait pas simplement perdre de la trace de ces objets, sinon cela aurait une fuite de mémoire. Mais ce qui est accompli en gardant une référence à ma fenêtre
code> autour de toujours, quand je ne vais plus jamais l'utiliser? P>
4 Réponses :
Cela pourrait expliquer: Problèmes de filetage AWT p>
Simplement, il y a beaucoup plus de choses dans la JVM que des composants visibles, avec des fils de fond, etc. Ces threads et autres ressources sont maintenus jusqu'à ce que la dernière fenêtre de la JVM ait été disposée, après quoi elles sont rangées et que la JVM peut alors quitter proprement. Donc, chaque fenêtre, fenêtre et fenêtre de dialogue que vous utilisez utilisez essentiellement une serrure sur la JVM pour l'empêcher d'arrêter de fumer, et vous devez gérer manuellement cela avec des appels vers Je suis d'accord c'est un peu d'un bugger. J'ai couru autrement de cela plusieurs fois moi-même. P> Dispose () P>. P>.
Je déteste le dire, mais c'est juste comment une interface graphique fonctionne. P>
Windows ne bloque pas. Ce qui signifie qu'une fois que vous avez créé un en code, votre code continue d'exécuter. P>
Cela signifie que votre fenêtre dépasse probablement de la portée immédiatement après la création, à moins que vous ne l'affiez explicitement une référence ailleurs. La fenêtre est toujours à l'écran à ce stade. P>
Cela signifie également que vous avez besoin d'une autre façon de vous en débarrasser lorsque vous en avez terminé. Entrez le La fenêtre dispose () code>
méthode, qui peut être appelé à partir de l'un des auditeurs de la fenêtre. P>
D'Oh! Je comprends! Les gens créent des fenêtres tout le temps qu'ils ne conservent pas de références, mais les fenêtres sont toujours visibles et fonctionnant. Je ne pensais tout simplement pas à cela parce que dans cette situation, nous utilisons immédiatement la fenêtre puis la rendant invisible, puis l'oublier (sortir de la portée). Maintenant, je vois pourquoi c'est la valeur par défaut pour Windows. Je savais qu'il y avait un cas d'utilisation rationnelle quelque part. :)
Oh, à droite, j'aurais dû souligner que la fenêtre était toujours à l'écran lorsque sa variable est sortie de portée. Je vais éditer cela à ma réponse juste au cas où quelqu'un manque cela.
en Java Lorsque vous avez un code natif (qui est ce que sont les pairs de ces composants de Windows), vous devez conserver une référence pour empêcher le collecteur des ordures d'essayer de récupérer l'objet pendant que les pointeurs natifs sont toujours là. causerait toutes sortes de mauvaises choses (accidents vm, etc.). P>
Voir, par exemple, la discussion ici . P>
Le Dispose () code> La méthode détruit l'objet détenu par l'objet code> WindowEvent code>. Il ne tue pas l'application / programme. p>
Lorsque
Removeotify code> est appelé, la fenêtre
code> sera supprimée de
allwindows code>.
fenêtre code> s contient des ressources natives, et devrait donc être éliminée de la même manière que s'il s'agissait d'une connexion de base de données.
J'avais l'impression que lorsque mes connexions de base de données sont hors de portée, elles se ferment automatiquement. Je me trompe probablement à ce sujet. :) De nos jours, tout ce qui est géré pour moi par un serveur sauf pour les programmes courts.