Kedy dojde k odstraneniu objektu?

Robert Novotny robert.novotny na upjs.sk
Středa Únor 25 11:23:01 CET 2009


Presne toto som vcera pozoroval na seminari z Javy.
Mali sme priklad, ked trieda mala po ukonceni aplikacie serializovat svoje  
data
na disk.

Najzjavnejsi a najjednoduchsi napad bolo pouzit finalize(). V  
inteligentnejsich pripadoch
by sa totiz zadanie skomplikovalo a na to nebol cas.

Polovici ludi to zbehlo a druhej polovici nie.
Aby sme to nakoniec nekomplikovali, rozhodli
sme sa volat finalize() manualne. Viac som po tom nepatral.

Ked sa na to pozeram, opat sa ukazalo, ze finalize() by v podstate
malo byt zakazane, lebo posobi len neplechu.

Vdaka za vysvetlenie.

RN



On Wed, 25 Feb 2009 10:44:41 +0100, Lukáš Zapletal <lukas na zapletalovi.com>  
wrote:

> 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.
>>
>>
>
>
>



-- 
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/



Další informace o konferenci Konference