Kedy dojde k odstraneniu objektu?
Robert Novotny
robert.novotny na upjs.sk
Čtvrtek Únor 26 15:52:10 CET 2009
Ano, ja som si uz na seminari uvedomil, ze to nie je dobre riesenie
(ani ako demonstracia) a teda, ze jedine dobre riesenie je
manualne zatvorenie. V tom danom priklade, ktory sme
na seminari rozoberali, by to vsak ulohu skomplikovalo.
Moralne ponaucenie z toho je, ze ak sa v niecom nevyznate dobre,
a chcete si tym zjednodusit situaciu, tak to radsej nepouzivajte,
lebo z toho vzidu este ovela vacsie hrozy.
On Thu, 26 Feb 2009 15:48:17 +0100, Ondrej Nekola <ondra na nekola.cz> wrote:
> 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
>> <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/
>
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Další informace o konferenci Konference