Re: "Destructor"?



Ingo Leschnewsky schrieb:
Hi Stefan!

Stefan Kuhne schrieb:

Dafür gibt es die finalize Methode:

Danke! Dazu aber gleich noch eine Frage...

Werden Objekte mit einer finalize-Methode denn "sofort" von der Garbage Collection bearbeitet, sobald sie nicht mehr referenziert werden?

Hängt vom Garbage Collector ab. Einer der einfachsten GC-Strategien ist das "Reference Counting", bei dem einfach ein Zähler inkrementiert und dekrementiert wird. Fällt er auf 0, kann auch gleich der Speicher freigegeben werden (und wird meistens auch).

Reference Counting funktioniert leider mit zyklischen Strukturen (A referenziert B, B referenziert A) nicht ohne manuellen Eingriff; Java hatte immer schon etwas kompliziertere GC-Strategien, die allerdings alle *irgendwann* ablaufen. Ein kurzes und gut verständliches White Paper dazu findest du unter <http://java.sun.com/javase/technologies/hotspot/gc/memorymanagement_whitepaper.pdf>.

Ich weiß ja über die Garbage Collection eigentlich nur, daß "irgendwann" aufgeräumt wird, z.B. wenn Speicher benötigt wird. Aber solange finalize (in Deinem Beispiel) nicht ausgeführt wird, hätte ja die statische Variable noch nicht den korrekten Wert. (Aufgrund dieses Problems hatte ich auch nach so etwas wie "free" (in C) Ausschau gehalten.)

Java garantiert dir übrigens nicht mal, dass finalize überhaupt ausgeführt wird. Sonst gäbe es nämlich System.runFinalizersOnExit nicht. Diese Methode ist übrigens deprecated, und das aus guten Gründen. Mehr dazu:

<http://www.hpl.hp.com/personal/Hans_Boehm/misc_slides/java_finalizers.pdf>

Sprachen sind unterschiedlich, auch wenn C und Java auf den ersten Blick wegen der Klammern und mancher Basistypen ähnlich aussehen. Du solltest dich drauf einstellen und versuchen, nicht C in Java-Syntax zu schreiben (real programmers can write Fortran in any language). Wahrscheinlich brauchst du free nicht, sondern ein anderes Vorgehen. Typischerweise eine explizite .dispose() oder .free() Methode in der Klasse, die du in einem finally {}-Teil des Objekt-Erzeugers aufrufst.

Lies dir am besten die Folien von Hans Böhm durch, dazu noch <http://www.devx.com/Java/Article/30192>. Wenn du danach immer noch der Ansicht bist, für ein Problem unbedingt sowas ähnliches wie einen Destructor zu brauchen, schlage ich vor, du fragst hier in dclj wieder nach.

Andreas
.



Relevant Pages

  • Re: Richtige Zerstörung von eigenen Objekten
    ... > das ich direkt keine Speicher freigeben kann. ... Die Finalize-Methode ist nicht für dich vorgesehen, ... Wenn auf deiner Festplatte 2 GB freier Platz sind, dein Programm 1 GB belegt ... Dispose auf, falls es noch nicht aufgerufen wurde. ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: For a fast implementation of Python
    ... a scripting language such as python may be the wrong tool. ... Java generally produces bytecode that is then run by a virtual machine, ... The reason is that Java's garbage collector is substantially faster ... C++ extension coding and eliminat reference counting bugs. ...
    (comp.lang.python)
  • Re: Richtige Zerstörung von eigenen Objekten
    ... > ich programmiere gerade meine eigene Klassen. ... Prinzipiell kannst du selbst explizit keinen Speicher freigeben. ... Der GC prüft bei Bedarf jede Klasseninstanz, ... Klasse besitzt eine Finalize-Methode, ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Lock-free reference counting
    ... example clearly shows that reference counting will NOT destroy `a' before `g'. ... How can you possibly make that assumption across all GC langs? ... Java most certainly does not do it, ... If what your writing about is true, then the Java GC would most certainly destroy the tree when it no longer referenced right? ...
    (comp.programming)
  • Re: Expressions in C#...
    ... Jon Skeet [C# MVP] wrote: ... for an in-depth post about why .NET doesn't use reference counting. ... I use Java all the time and see neither of them. ...
    (microsoft.public.dotnet.languages.csharp)