Arbeitsweise von finalize()

raphw

Mitglied
Hallo zusammen,
ich wundere mich gerade, warum folgendes Beispiel nicht funktioniert:

Java:
public class FinalizeTest {
	
	MyContainer a;
	
	FinalizeTest(MyContainer a) {
		
		this.a = a;
	}
	
	public static void main(String[] args) throws Exception {
		
		System.out.println("start");
		
		MyContainer a = new MyContainer();
		
		FinalizeTest b = new FinalizeTest(a);
		
		while(true) {

			Thread.sleep(1000);
			System.out.println("Status: "+ a.val + " (b=" + b + ")");
			b = null;
			
		}
		
	}
	
	protected void finalize() throws Throwable {

		a.val = "finalized";
		super.finalize();
		
	}

}

class MyContainer {
	
	public String val = "not finalized";
	
}

Soweit ich es verstanden habe, müsste der Garbage Collector doch nach einiger Zeit finalize() von dem anfänglich b zugewiesenen Container aufrufen. Oder was mache ich falsch?

Vielen Dank und viele Grüße,
Rafael
 
M

maki

Gast
Soweit ich es verstanden habe, müsste der Garbage Collector doch nach einiger Zeit finalize() von dem anfänglich b zugewiesenen Container aufrufen.
Der GC muss gar nicht arbeiten, finalize() muss nicht aufgerufen werden.
Am besten finalize() nie verwenden.
 

ARadauer

Top Contributor
Java:
System.gc();
        while(true) {
dann klappt das... aber! wie schon gesagt, kann man sich da nie 100%ig sicher sein...
Im Grunde kann man finalize schon für irgendwelche nebensächlichen Statistiken und Logging Themen verwenden.

Aber hier Fachlogik oder technisches wie irgendwelche Connections oder Resourcen schließen.... das kann tötlich sein!!
 

tfa

Top Contributor
Im Grunde kann man finalize schon für irgendwelche nebensächlichen Statistiken und Logging Themen verwenden.
Lieber nicht. finalize überschreiben behindert den GC. Der Tipp, Finalizer komplett zu ignorieren ist schon am besten.
 
Ähnliche Java Themen

Ähnliche Java Themen


Oben