Re: "Destructor"?
- From: Andreas Hartl <nd@xxxxxxxxxxxxxxxxx>
- Date: Thu, 06 Dec 2007 14:28:17 +0100
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
.
- References:
- Re: Hat OOP Vorteile gegenueber prozeduraler oder modularer Programmierung?
- From: Till Potinius
- Re: Hat OOP Vorteile gegenueber prozeduraler oder modularer Programmierung?
- From: Ingo R. Homann
- "Destructor"? war: Hat OOP Vorteile gegenueber prozeduraler oder modularer Programmierung?
- From: Ingo Leschnewsky
- Re: "Destructor"? war: Hat OOP Vorteile gegenueber prozeduraler oder modularer Programmierung?
- From: Stefan Kuhne
- Re: "Destructor"?
- From: Ingo Leschnewsky
- Re: Hat OOP Vorteile gegenueber prozeduraler oder modularer Programmierung?
- Prev by Date: setUndecorated bei JInternalFrame
- Next by Date: Re: "Destructor"? war: Hat OOP Vorteile gegenueber prozeduraler oder modularer Programmierung?
- Previous by thread: Re: "Destructor"?
- Next by thread: Re: "Destructor"?
- Index(es):
Relevant Pages
|