Witam.
Dopiero uczę się JAVY z ksiązki Thinking in JAVA B. Eckela. Mam pytanie dot. sprzątania, a dokładniej metody finalize().
Wklepałem przykład ze str. 160 tejże książki:
package nauka.rozdzial5;
class Book{
boolean checkedOut = false;
Book(boolean checkOut)
{
checkedOut = checkOut;
}
void checkIn()
{
checkedOut = false;
}
protected void finalize()
{
System.out.println("wszedł do finalize();");
if(checkedOut){
System.out.println("Błąd: w obiegu");
//Normalnie użyłbyś również tego:
//super.finalize(); //Wywołanie wersji bazowej
}
}
}
public class TerminationCondition {
public static void main(String[] args){
Book novel = new Book(true);
//właściwe "sprzątanie":
novel.checkIn();
//Porzucenie referencji, przeoczenie sprzątania:
new Book(true);
//Wymuszenie odśmiecenia pamięci i finalizacji:
System.gc();
}
}
i teraz moje pytanie. Zgodnie z tym, co sugeruje autor na wyjściu powinien pojawić się komunikat "Błąd: w obiegu". Jest to dla mnie jasne, ponieważ w ostatniej linijce metody main wywołuję odśmiecacz, który z kolei wywołuje finalize(). Problem polega na tym, że po przekompilowaniu przykładu nie widzę tego komunikatu. Na początku finalize() dodałem komunikat "wszedł do finalize();" i jego też nie widzę, więc od razu widać, że ta metoda się nie wykonuje.
Co ciekawe, kiedy debuguję kod, to finalize ładnie i zgodnie z moim oczekiwaniem się wykonuje.
Moja prośba do Was - czy ktoś możę mi wytłumaczyć dlaczego tak się dzieje? Dlaczego tylko w trybie debug uruchamia się System.gc() i finalize()?
Z góry dziękuję za odpowiedź.
P.S. Jeśłi to ma znaczenie, to używam Netbeans 7.2 dla x64