Necetl jsem to vse cele, ale je nutne si uvedomovat, ze GC nemusi
objekt uklidit vubec! Paklize dojde k ukonceni programu, nez dojde
pridelena heap a GC se "nerozhodne" vubec pro uklid, tak se javovsky
proces ukonci a vrati cely blok pameti do OS.

Tj k volani finalize nedojde vubec.

LZ

2009/2/24 Tomas Studva <[email protected]>:
> To kedy sa dealokovalo f, zaviselo od velkosti pola, cize ci sa este pred
> cyklom automaticky spustilo gc.
>
> Treba si vsak uvedomit ze kompilator nemoze takmer vobec ovplyvnit
> dealokaciu - ak by bol predposledny prikaz bloku volanie nejakej metody, tak
> uz nik nevie co sa stalo. Nejako vsak ten gc vie ze na f uz nic neukazuje,
> alebo je v inej generacii ako stuff. Napada mi reference counting, ale to sa
> zevraj nepouziva v gc-ckach (viem ale ze ref-count. napr. pouziva Cocoa).
>
> Zdenek Tronicek  wrote / napísal(a):
>>
>> Ja jsem popisoval, jak se chova JVM za "normalnich" podminek. V okamziku,
>> kdy zacne dochazet pamet, zacne JVM drsne optimalizovat. A ze to umi, lze
>> videt na tomto prikladu (z Vaseho kodu jsem vypustil blok):
>>
>>        System.out.println("start");
>>        // vytvorim Foo
>>        Foo f = new Foo(null);
>>        // vytvorim pole Stuff
>>        Stuff[] theStuffs = new Stuff[100000];
>>        for (int i = 0; i < theStuffs.length; i++) {
>>            theStuffs[i] = new Stuff();
>>        }
>>        // nez se dojde sem, je po objektu f
>>        while (true) {
>>            System.out.println("aaa");
>>            Runtime.getRuntime().gc();
>>            try {
>>                Thread.sleep(200);
>>            } catch (InterruptedException e) {
>>                // TODO Auto-generated catch block
>>                e.printStackTrace();
>>            }
>>        }
>>
>> Na mem pocitaci dojde k dealokaci objektu f jeste drive, nez se vstoupi do
>> smycky while. Jak k tomu muze dojit? Java neco takoveho neumoznuje, jde
>> ciste o optimalizaci JVM.
>> Mimochodem, myslim, ze tohle je na hranici toho, co jeste lze delat,
>> protoze kdyby nejaky program spolehal na to, ze objekt nemuze byt dealokovan
>> pred koncem platnosti promenne f (tj. pred koncem metody), nebude fungovat.
>>
>> Pokud jde o ty lokalni promenne, tak ve vypise javap je jejich pocet za
>> retezcem Locals= a po dobu vykonavani metody se tato hodnota nemeni.
>>
>> Z.T.
>
>



-- 
Lukas Zapletal
http://lukas.zapletalovi.com

Odpovedet emailem