Sind unsichtbare Referenzen in den letzten JVMs immer noch ein Problem?

Ich habe gelesenJava Platform Performance (Leider scheint der Link aus dem Internet verschwunden zu sein, seit ich diese Frage ursprünglich gestellt habe) und Abschnitt A.3.3 haben mich beunruhigt.

Ich war davon ausgegangen, dass eine Variable, die aus dem Geltungsbereich herausfällt, nicht länger als GC-Root betrachtet wird, aber dieses Papier scheint dem zu widersprechen.

Haben aktuelle JVMs, insbesondere die Version 1.6.0_07 von Sun, diese Einschränkung noch? Wenn ja, dann muss ich viel Code analysieren ...

Ich stelle die Frage, weil das Papier von 1999 ist - manchmal ändern sich die Dinge, besonders in der Welt der GC.

Da das Papier nicht mehr verfügbar ist, möchte ich das Anliegen umschreiben. Das Papier implizierte, dass Variablen, die innerhalb einer Methode definiert wurden, bis zum Verlassen der Methode als GC-Stamm betrachtet werden und nicht bis zum Ende des Codeblocks. Daher musste die Variable auf null gesetzt werden, damit das Objekt, auf das verwiesen wird, mit Garbage Collection behandelt werden kann.

Dies bedeutete, dass eine lokale Variable, die in einem bedingten Block in der main () -Methode definiert ist (oder eine ähnliche Methode, die eine Endlosschleife enthielt), einen einmaligen Speicherverlust verursachen würde, es sei denn, Sie haben eine Variable kurz vor dem Verlassen des Gültigkeitsbereichs auf Null gesetzt.

Der Code aus demgewählte Antwort veranschaulicht das Problem gut. In der Version der JVM, auf die im Dokument verwiesen wird, kann das foo-Objekt nicht mit Bereinigung gesammelt werden, wenn es am Ende des try-Blocks den Gültigkeitsbereich verlässt. Stattdessen hält die JVM die Referenz bis zum Ende der main () -Methode offen, obwohl diese Referenz von niemandem verwendet werden kann.

Dies scheint der Ursprung der Idee zu sein, dass das Nullen einer Variablenreferenz dem Garbage Collector helfen würde, selbst wenn die Variable gerade aus dem Geltungsbereich fallen würde.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage