Sie können dies nicht zur Laufzeit mit einem beliebigen Objekt tun, und in der Tat ist es nicht vollständig möglich, dies deterministisch zu tun. Allerdings gibt es zwei Optionen, die geeignet sein können, je nach Bedarf:
- einen Heap Dump Nehmen Sie, nachdem Sie den Verweis auf
null
gesetzt, und es dann in einem Haufen Analysewerkzeug wie jhat oder einen Profiler laden, dass unterstützt dies. Mit diesen Tools können Sie den Pfad von den GC-Wurzeln durchlaufen und somit überprüfen, ob Ihr Objekt noch erreichbar ist oder nicht.
- Wickeln Sie das Objekt in eine PhantomReference mit einer gegebenen
ReferenceQueue
. Wenn der Verweis in die Warteschlange eingereiht wird, wissen Sie, dass das Objekt als Müll erfasst wurde. (Wenn der Verweis nicht in die Warteschlange gestellt wird, kann dies daran liegen, dass das Objekt noch erreichbar ist, oder weil der GC das Objekt noch nicht überprüft hat. Wie bei allen GC-bezogenen Fragen ist die Garbage Collection kein deterministischer Prozess! )
im Großen und ganzen aber ich stimme zu, dass die beste Option bewusst von Speicherverlust Fragen sein und gestalten sie Ihre Anwendung, sie zu vermeiden. Wenn Sie ein Speicherleck haben, sollte es offensichtlich genug sein, und Sie können sich dann darauf konzentrieren, das Problem zu finden (wiederum durch Dumping und Analysieren des Heaps für Objekte, die fälschlicherweise erreichbar sind).
Die oben genannten Schritte sind relativ zeitaufwendig und sollten nicht nach jeder Änderung durchgeführt werden, nur um sich selbst zu beruhigen, sondern sind Werkzeuge, die Sie verwenden, um ein spezifisches Problem zu untersuchen.
es ist eine huuuuuuuuuuuuge Anwendung, wo wir Gedächtnisprobleme erlebt. Eine Optimierung sollte nun zu einer Verbesserung führen, aber nicht so viel wie von uns erwartet. Daher möchten wir gerne wissen, ob bestimmte Objekte Müll gesammelt werden. Danke für deine Antwort, ich werde es ausprobieren! – swalkner
Korrekt erhalten Sie einen reinen Müll: D – delive