Garbage Collection Details: Ist dieses Objekt für GC geeignet?

8

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?

%Vor%

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.

    
aioobe 08.05.2011, 13:21
quelle

2 Antworten

5

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).

    
6502 08.05.2011, 14:00
quelle
2
  

... kann möglicherweise ausgeben "Dieses Objekt ist bekanntermaßen nie referenziert." vor "fertig".

Es gibt drei mögliche Verhaltensweisen:

  • Die Nachricht wird vor "done",

  • ausgegeben
  • Die Nachricht wird nach "done",

  • ausgegeben
  • 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:

  • muss der GC laufen,
  • Der GC muss das Objekt als unerreichbar erkennen und
  • Der GC muss das Objekt abschließen.

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.

    
Stephen C 08.05.2011 14:24
quelle

Tags und Links