Ahoj.

Kedze som v jave novy a prechadzam do nej z C++, obcas sa pri programovani 
pozastavim nad nejakou vecou, o ktorej viem, ze tak nejak funguje, ale aby 
som mal pokojne spanie, musim si to osahat vlastnymi rukami.

Prave som napisal nejaku class-u, ktora obaluje urcite podclassy a poskutyje 
urcitu ucelenu funkcionalitu. Tie jej podclassy rozne ukazuju sami do seba, 
medzi sebou a tak podobne, proste o sebe vedia. A tak sa mi hlavou zacali 
tocit otazky okolo garbage collectoru, platnosti objektov, case ich uvolnenia 
z pamati a tak podobne.

A kedze som bol byvalym kolegom ( zdravim Ta Nhac :) ) presviedsany, ze reci 
okolo javy a jej pamatovej nenazranosti su nezmysly, vyrobil som si rovno 
maly test:

// obycajna class-a. Vypisom testujem cas jej odstranenia z pamati
// urdzuje odkaz na svoju nadradenu classu, pretoze obe budem nejak
// zapuzdrovat do jedneho celku a vyuzivaju medzi sebou svoje sluzby

public class Foo {

    private Stuff stuff;

    public Foo ( Stuff s ) {
        this.stuff = s;
    }

    @Override
    protected void finalize() {
        System.out.println("finalize Foo");
    }
}


// nejaka dalsia classa
public class Stuff {

    public Foo foo = new Foo ( this );

    @Override
    protected void finalize() {
        System.out.println("finalize Stuff");
    }
}


public static void main(String[] args) {

        System.out.println("start");
        {
            // vytvorim Foo
            Foo f = new Foo(null);
            // vytvorim Stuff, ten si vytvori dalsie Foo
            Stuff s = new Stuff();
            // f = null
        }

        // tu uz neexistuje ani Foo f, ani Stuff f, mozu byt zmazane

        while ( true ) {
                System.out.println("aaa");
                Runtime.getRuntime().gc();
                Thread.sleep(2000);
        }
    }
}


Kupodivu, vystupom programu bol nasledovny vypis:
        start
        aaa
        aaa
        aaa
        ...

Po pol hodine som to nechapajuc breakol.

Odkomentoval som to "f = null"

Vystup:
        start
        aaa
        finalize Foo
        aaa
        aaa
        aaa
        ...

Toto som nechal bezat par minut. Garbage collector ten Stuff nie a nie zmazat.

Priznam sa, ze to uplne nechapem, pretoze za prvou zlozenou zatvorkou } 
straca "Stuff s" platnost a nema dovod viac existovat v pamati.

Mna by zaujimalo, kedy ho gc uvolni, pretoze pokial bude mat Stuff 2GB, bude 
aplikacia bezdovodne kradnut systemu 2GB pamati na bordel, ktory uz nikdy 
nepouzije, boh vie na aku dlhu dobu.

Diky.

-- 
Dusan

Odpovedet emailem