Na neco takoveho vam finalize nepomuze. Duvody psalo nekolik lidi prede mnou. O finalize se podrobneji pise trebas v Blochovi. Vysledek je, ze moznosti pro jeho pouziti jsou male, nekdo tu ukazoval "zalozni" dealokaci nekritickych zdroju, ja bych doplnil moznost napsat nejaky vypis typu "Tady nejaky pitomec programator neuzavrel spojeni, trida XYZ neni spravne uzivana." finalize() bych radeji nikdy nevolal manualne, napsal bych si radeji metodu close() nebo finishWork() nebo dealocate().. popsal ji v javadocu a tu volal rucne. A pak (po overeni, ze je to treba) ji pripadne volal z finalize jako moznost posledni zachrany.
        OSN
PS: mnohdy je finaly to, co potrebujete.

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 <lu...@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 <tstu...@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/

Odpovedet emailem