2010-11-19 7 views
6

Y at-il un moyen de vérifier si un objet peut être récupéré par le garbage collector?Vérifiez si l'objet peut être récupéré par le garbage collector

Quelque part dans mon code, j'ai une référence à un objet:

MyObject mo = myObject; 

Ensuite, via Eclipse Debugger, je reçois les objets emplacement mémoire. Ensuite, je mets la valeur nulle de référence:

mo = null; 

Est-il possible de vérifier si l'objet précédemment référencé est maintenant adapté à la collecte des ordures ou s'il y a quelque part une autre référence à elle?

Merci beaucoup,

Stefan

Répondre

13

Vous ne pouvez pas faire cela à l'exécution avec un objet arbitraire, et en fait ce n'est pas entièrement possible de le faire de manière déterministe. Cependant, il y a deux options qui peuvent convenir en fonction de vos besoins:

  1. Prenez une décharge de tas après avoir défini la référence à null, puis le charger dans un outil d'analyse de tas, comme jhat ou un profileur soutient cela. Ces outils devraient vous permettre de traverser le chemin à partir des racines GC et ainsi vérifier si votre objet est encore accessible ou non.
  2. Enveloppez l'objet dans un PhantomReference avec ReferenceQueue donné. Lorsque la référence est mise en file d'attente, vous savez que l'objet a été récupéré. (Malheureusement, si la référence n'est pas sauvegardée, cela peut être parce que l'objet est encore accessible, ou parce que le GC n'a tout simplement pas encore inspecté l'objet Comme pour toutes les questions liées au GC, la récupération de place n'est pas un processus déterministe!)

Dans l'ensemble cependant, je suis d'accord que la meilleure option est d'être conscient des problèmes de fuite de mémoire et concevoir votre application pour les éviter. Si vous avez une fuite de mémoire, cela devrait être assez évident, et vous pouvez alors concentrer vos énergies sur la découverte du problème (encore une fois en vidant et en analysant le tas pour les objets qui ne sont pas joignables correctement). Les étapes ci-dessus sont relativement chronophages, et ne devraient pas être quelque chose que vous faites après chaque changement juste pour vous rassurer, mais plutôt des outils que vous utiliseriez pour étudier un problème spécifique à .

+0

c'est une application huuuuuuuuuuuuuge, où nous avons connu des problèmes de mémoire. une optimisation devrait maintenant conduire à une amélioration, mais pas autant que nous l'espérions. Par conséquent, nous aimerions savoir si des objets spécifiques sont collectés. merci pour votre réponse, je vais l'essayer! – swalkner

+0

Correct, vous obtiendrez une poubelle pure: D – delive

1

Non, la seule chose à faire est d'être prudent et garder à l'esprit que les fuites de mémoire peuvent exister en Java lors de l'écriture de votre application. La seule chose que vous pouvez faire est d'utiliser des outils pour essayer de trouver d'où proviennent les fuites de mémoire lorsque vous avez remarqué un tel problème. Je recommande fortement Memory Analyzer à cet effet.

+0

merci pour votre réponse! Bien sûr, faire attention est la chose la plus importante, mais parfois ce n'est pas assez ou possible (voir la réponse à andrzey doyle) – swalkner

Questions connexes