Comment détruire les objets java?
Bien, j'ai développé une application java à l'aide de plusieurs objets de relations qui font de l'utilisation de la mémoire trop cher. Je n'ai aucune expérience de la gestion de la mémoire java parce que la conception de l'application de la rendre difficile pour détruire les objets et les ré utiliser l'espace dégagées précédemment. Par exemple, je suis en utilisant Observateur et motifs MVC.
Donc, la théorie dire que..
Un Objet devient admissible pour la collecte des Ordures ou GC si ses pas
accessible à partir de n'importe quel fils ou de l'électricité statique de référence
En d'autres termes, vous pouvez dire qu'un objet devient admissible pour la collecte des ordures si son toutes les références sont nulles.
Mais, dans ma courte expérience, a être trop difficile pour moi de détruire toutes les références d'objets que je veux supprimer de la mémoire (par exemple, si un cadre est fermé) quand vous avez un scénario comme la mienne, où vous ne savez pas comment de nombreuses références à des classes existe.
En fonction de ce contexte, comment puis-je faire face à la destruction de l'objet lorsqu'il y a plusieurs références à celui-ci? ou comment ai-je besoin pour gérer la mémoire, quand vous avez un complexe de références les uns les autres?
OriginalL'auteur manix | 2012-07-10
Vous devez vous connecter pour publier un commentaire.
Garder La Trace
En vous assurant que ces références ne sont plus nécessaires.
Si vous isoler, même dans un grand graphe isolé d'objets inutilisés pas connecté plus principale de votre programme, alors ils sont tous admissibles pour la collecte des ordures.
Variables locales qui ont atteint la fin de leur champ d'application sera admissible pour la collecte des ordures (et leur contenu) des objets, s'ils n'ont pas été "lié" à quoi que ce soit d'autre (ajouté à une collection, ca omposite, etc...). Pour les objets de l'INTERFACE utilisateur, qui peut en effet être difficile de la raisonner en termes de graphes d'objets, assurez-vous de disposer d'eux correctement ou de lire la documentation pour s'assurer qu'ils seraient naturellement éliminés.
"Laisser [GC] Seul!!"
Vous ne pouvez pas "gérer" de la mémoire. Vous pouvez simplement gérer les références. L'idée est de "grave" vos connexions à vos objets en n'ayant pas simplement des références. Ils vivent alors dans la mémoire jusqu'à ce que le GC extermine.
N'essayez pas de jouer avec la GC pour le forcer à faire des choses. C'est un peu bête intelligente, et tandis que vous pouvez essayer pour le charger de réagir à certaines demandes explicitement - c'est peut-ignorer - c'est généralement une mauvaise idée: ne pas invoquer le GC explicitement, éviter les finaliseurs et explicite micropression si vous ne comprenez pas leurs implications.
Note de répondre à votre commentaire
Simplement invalide un référence à un objet qui a été ajoutée à plusieurs collections composites ou ne sera pas admissible pour la collecte. En faisant cela, vous auriez seulement entaché de nullité d'une référence.
Vous avez besoin de retirer l'objet de toutes les listes ou les conteneurs qui ont une référence (en gros, les faisant "oublier" à propos de cet objet). Une fois n'objets encore "se souvient" ou a un "lien" vers votre objet créé, il devient un seul élément dans le Garbage Collector du graphique, ce qui en fait un candidat pour la suppression.
Peut être paraître fastidieux, mais si vous y pensez, à partir d'une langue où vous gérer manuellement la mémoire (C ou C++, le nom de la plus 2 références évidentes), gratuit-ing et nulle-ment des pointeurs vers vos objets alloués dynamiquement aurait pour effet de les détruire, mais vous auriez encore besoin de supprimer l'élément de la liste (ou de toute conteneurs) ou ils apparaissent comme vide les seaux à un pointeur null.
Lecture
object = null
va supprimer toutes les références?non, il ne sera pas. que serait juste null la référence nommée
object
dans le champ d'application actuel. Vous devez en effet supprimer cet objet à partir de l'ensemble de ces listes ou tout autre contenant.Sont les multiples arraylists de courte ou de longue durée? Si elles sont de courte durée, alors il n'y a pas de problème. Après la liste de tableaux n'est plus accessible, le garbage collector travailler sa magie. OTH si la liste de tableaux est de longue durée, alors tous ses éléments seront accessibles au cours de sa vie, à moins que vous fassiez quelque chose. Je vous recommande de courte durée arraylists.
oui, mais la courte durée aspect est déjà couvert dans ma réponse: les objets locaux seront éligibles pour la collecte, et donc, va devenir leur contenaient des références (si ce n'est helf n'importe où ailleurs). C'est un domino effet de comptage de référence.
comme vous paraissent nouvelles, si... si cette réponse (et d'autres) vous aider et pour répondre à votre question, vous devriez upvote (à l'aide de la pointant vers le haut sur la gauche de chaque réponse), et d'accepter celui qui répond correctement à votre question (à l'aide de la "tique" symbole sur la gauche de chaque réponse). Pas dire que vous devez le faire savoir, vous pouvez vous donner le temps de prendre une décision et d'attendre plus de réponses, bien sûr.
OriginalL'auteur haylem
Le point de l'ensemble de java, la collecte des ordures, c'est que vous n'avez pas à faire quoi que ce soit. La collecte des ordures est fait pour vous.
comment utiliser un "proxy" de la méthode comme @Martinsos dit? afin d'en supprimer les références
OriginalL'auteur emory
D'assigner chaque référence que vous souhaitez le GC de collecter pour
null
.OriginalL'auteur Cuga
Ce que vous pourriez faire est de faire une classe intermédiaire. Par exemple, si vous avez instance de la classe A, pour qui vous avez beaucoup de références et que vous souhaitez la supprimer, mais beaucoup de références rend difficile, vous pouvez effectuer les opérations suivantes: créer une instance de la classe B qui ne contient rien d'autre que la référence à l'instance de la classe A (comme une sorte de proxy). Maintenant, vous aurez beaucoup de références à l'instance de la classe B, mais seulement une référence à l'instance de la classe A, qui vous pouvez facilement supprimer et le garbage collector permettra de recueillir de l'instance de la classe A.
Image montre la différence lors de l'utilisation de proxy (instance de classe B): Maintenant, un seul doit être retiré.
OriginalL'auteur Martinsos
Pour la plupart, GC va faire c'est de la magie au bon moment.
Vous pouvez avoir une situation dans laquelle, disons, d'un point de vue est l'observation d'un modèle et que vous souhaitez abandonner le point de vue, mais garder le modèle. Dans ce cas, vous devrez vous souvenir de l'observateur de rappel des objets, et de les supprimer lorsque vous discar la vue. Vous n'avez pas nécessairement besoin d'avoir des champs spéciaux pour chaque observateur - un ensemble de tâches qui annuler l'inscription d'un rappel à chaque va être bien. Ou, plus complexe, vous pouvez avoir une couche transitoire de l'indirection sur le modèle de ce qui s'ouvre à partir du sous-jacent. Je suggère d'éviter les trucs bizarres avec des références faibles d'une sorte ou d'une autre.
Dans le cas où vous avez finalisers (ou d'exiger une sorte de faiblesse de la carte d'expulsion), comme sans doute avec un java.awt.Cadre, Vous voudrez peut-être une couche d'indirection entre la ressource et le dévoreur de mémoire, qui peuvent simplement être entaché de nullité.
OriginalL'auteur Tom Hawtin - tackline