Jasne, mate pravdu. Myslim neco a pisu neco jinyho. Takze jsem ze sebe opet
udelal idiota ;-)
Diky za upresneni.
Filip Jirsák
<filip.jir...@gma
il.com> To
Sent by: Java <[email protected]>
konference-bounce cc
[email protected]
Subject
Re: Kedy dojde k odstraneniu
25/02/2009 11:19 objektu?
Please respond to
Java
<konfere...@java.
cz>
> pridam taky svoji trochu do mlyna. Ono to je jeste trochu slozitejsi.
Pokud
> si dobre vzpominam na specifikaci, tak je receno, ze finalize() v
normalnim
> pripade probehne PRAVE jednou pri prvnim pokusu o "uklizeni" objektu.
Muze
Dobré odpoledne,
tohle je právě častý omyl. Ve specifikaci (JavaDoc) je řečeno, že
metoda proběhne *maximálně* jednou:
The finalize method is never invoked more than once by a Java virtual
machine for any given object.
Případů, kdy lze metodu finalize() použít, není mnoho -- napadá mne
jedině nějaké uvolňování zdrojů, které není pro aplikaci kritické. Tj.
jedná se o zdroj, kterého pravděpodobně nebude nedostatek (jinak je
lepší jej uvolnit hned, jak je to možné), a zdroj se automaticky
uvolní po skončení aplikace (tj. nevadí, pokud finalize() vůbec
neproběhne). Pokud je potřeba nějaký kód provádět skutečně při
odstranění objektu a není možné to udělat na úrovni ḱódu (tj. třeba se
nedá spolehnout na to, že bude vždy zavolána metoda close()), je lepší
použít ReferenceQueue.
Jinak asi platí, že díky garbage collectoru se programátor v běžných
případech nemusí o uvolňování objektů starat (a neměl by se pokoušet
to nějak optimalizovat, protože nejspíš napáchá víc škody než užitku).
A pokud už je nutné se tím zabývat (velké objekty, různé reference,
vícevláknové aplikace a zamykání), je potřeba si nastudovat pořádně,
jak správa paměti v Javě funguje a jaké jsou možnosti -- na to pár
odpovědí v konferenci nestačí.
S pozdravem
Filip Jirsák