Ich nehme an, dass ein Programm wie dieses ...
%Vor% ... kann möglicherweise "this object is known to never be referenced."
vor "done"
ausgeben. (Korrigiere mich, wenn ich hier falsch liege!)
Darüber hinaus ist es für einen Compiler / JVM einfach, "ungelesene lokale" zu erkennen. In dem folgenden Programm zum Beispiel bemerkt Eclipse, dass " Die lokale Variable t wird nie gelesen ".
Aber wäre es illegal, wenn die JVM "this object is known to never be referenced."
vor "done"
für die (.class-Version) des folgenden Programms ausgibt?
Die meisten Dokumente der Garbage Collection sprechen über Erreichbarkeit. Angesichts der Tatsache, dass t
niemals gelesen wird, ist das Objekt offensichtlich nicht "erreichbar" oder?
Referenzen zu den JLS sind willkommen.
In 12.6.1 der Java-Sprachspezifikation sagt:
12.6.1 Finalisierung implementieren
Jedes Objekt kann durch zwei charakterisiert werden Attribute: es kann erreichbar sein, Finalizer - erreichbar oder unerreichbar und es kann auch unfinalisiert sein, finalisierbar oder finalisiert Ein erreichbar Objekt ist jedes Objekt, das sein kann in jedem möglichen Potential fortgesetzt Berechnung von jedem Live-Thread. Optimieren von Transformationen von a Programm kann so gestaltet werden, dass es reduziert die Anzahl der Objekte, die sind erreichbar zu sein weniger als diejenigen, die würde naiv als erreichbar erachtet werden.
Zum Beispiel ein Compiler oder Code Generator kann wählen, eine Variable zu setzen oder Parameter, der nicht mehr sein wird verwendet, um den Speicher für Null zu verursachen ein solches Objekt potenziell sein zurückforderbar früher.
Der letzte Satz scheint mir genau den Fall abzudecken, nach dem Sie fragen. Die Variable t
kann implizit vor dem Ende des Bereichs auf null
gesetzt werden, wodurch das Objekt nicht erreichbar ist.
Dies in C ++ wäre ein Desaster, da viel Code vom genauen Zeitpunkt der Zerstörung am Ende des Bereichs abhängt (z. B. für Sperren).
... kann möglicherweise ausgeben "Dieses Objekt ist bekanntermaßen nie referenziert." vor "fertig".
Es gibt drei mögliche Verhaltensweisen:
Die Nachricht wird vor "done",
Die Nachricht wird nach "done",
Die Nachricht "Dieses Objekt ist bekannt, dass nie darauf verwiesen wird" wird überhaupt nicht ausgegeben.
(In der Praxis ist das wahrscheinlichste Verhalten das letzte. Tatsächlich ist es eine virtuelle Sicherheit, es sei denn, Sie erzeugen zwischen dem Erstellen der Test
-Instanz und dem Drucken "done" viel Müll.)
Es wäre jedoch illegal, wenn die JVM "dieses Objekt wird nie als referenziert" ausgibt. vor "fertig" angesichts der (.class-Version) des unten stehenden Programms?
Nein, das wäre nicht illegal. Die Test
-Instanz kann nicht in einer potenziellen fortlaufenden Berechnung von einem Live-Thread abgerufen werden und ist daher nicht erreichbar. Daher wäre es legal für die JVM, sie zu sammeln und sofort zu finalisieren.
Allerdings müssen drei Ereignisse auftreten, damit die Nachricht angezeigt wird:
Es gibt keine Garantie dafür, dass alle diese Ereignisse auftreten, bevor die Anwendung beendet wird, und zwar allein im Fenster zwischen dem Erstellen der Instanz und dem Ausdruck "done".
Die Quintessenz ist, dass Sie niemals von der Finalisierung in einer Java-Anwendung abhängig sein sollten.
Tags und Links java garbage-collection