PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wann wird finalize nicht aufgerufen?



Nuke
12-11-2006, 17:26
Hi.

Ich lerne mich gerade ein bisschen in Java ein und seh gerade nicht durch.

Ich habe gelesen das die finalize-Methode immer aufgerufen wird. Das mag ja schon sein, aber wird auch der GabageCollector (der ja finalize aufruft) immer aufgerufen? Es geht um das beenden des Programms.

Hab jetzt z.B. folgenden Code für den main-Part (hab eigentlich ein Datenbank-Projekt, aber der Code wäre jetzt zu lang).



package myPack;

public class start {

/**
* @param args
*/
public void doIt() {
MyClass c = new MyClass();
c.setMyInt(1232423);
}

public static void main(String[] args) {
// TODO Auto-generated method stub

start a = new start();
a.doIt();
}

}


In MyClass steht:


package myPack;

public class MyClass {
int myInt;

public int getMyInt() {
return myInt;
}

public void setMyInt(int a) {
this.myInt = a;
}

@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
System.out.println("Das ist ein Test");
super.finalize();
}
}


So. Beim Durchlauf des Programms wird die Meldung "Das ist ein Test" nicht angezeigt. Warum?

Bei meinem Datenbank-Projekt wird so nämlich die Verbindung zur Datenbank nicht sauber beendet, wenn ich "close" nicht explizit aufrufe (entsprechender Log-Eintrag "LOG: unexpected EOF on client connection" beweist das).

Wenn ich nach a.doIt(); ein System.gc(); mache, dann ist alles in Ordnung.

Kann mir das mal bitte einer erklären?

P.S.: Ja ich weiß das ich darauf achten sollte "close" aufzurufen, aber es geht mir jetzt um's Prinzip. ;)

Danke. :)

nul
12-11-2006, 17:35
Finalize wird aufgerufen wenn der GC keine Referenz mehr auf das entsprechende Objekt findet.
Es ist aber nun nicht so dass immer wenn keine Referenz mehr da ist sofort der GC anspringt, ein System.gc() garantiert das auch nicht:

Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.

Nuke
12-11-2006, 17:50
Also wird beim normalen Beenden des Programms der GabageCollector nicht aufgerufen, oder wie?

bischi
12-11-2006, 18:15
Nicht zwingend.

MfG Bischi

Nuke
12-11-2006, 18:26
Hmm... OK. Danke.

anda_skoa
12-11-2006, 20:06
Sich beim Freigeben von Betriebsystemresourcen, u.a. Filedescriptoren und Sockets, auf den GarbageCollector zu verlassen ist ohnehin schlechter Stil, weil keine Aussage über den Zeitpunkt des Aufrufs gemacht werden kann.

Ciao,
_

Nuke
12-11-2006, 20:21
Wie gesagt. Das ist mir schon klar (sie das "P.S.").

Ich bin halt nur etwas in Objective-C eingewöhnt. Da wird nach jeden Event-Loop der Autorelease-Pool geleert. Da wusste man noch wann was passiert. ;)

Muss ich hier halt etwas umdenken.