Kedy dojde k odstraneniu objektu?
Lukáš Zapletal
lukas na zapletalovi.com
Středa Únor 25 10:44:41 CET 2009
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 <tstudva na gmail.com>:
> 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
Další informace o konferenci Konference