Poiché Java è un linguaggio di sicurezza e la piattaforma, la memoria non viene liberata. Anche gli associati PhantomReference
s non saranno accodati sui loro ReferenceQueue
s. La VM chiamerà sempre finalize
su un oggetto una sola volta. C'è un bel diagramma di stato nella specifica JVM.
In genere se si utilizza un finalizzatore, è necessario lasciare la dichiarazione come @Override protected void finalize() throws Throwable
, in modo da non disturbare l'API. Ancora meglio usare un finaliser protetto, come in 1st Ed efficace di Java.
Questo particolare trucco ha colpito i titoli di testa (del San Jose Mercury, comunque) quando un gruppo di Princeton lo usava per costruire un codice personalizzato ClassLoader
da codice non affidabile. Sebbene la specifica sia stata leggermente rafforzata (il costruttore Object
deve terminare l'esecuzione normalmente prima che il finalizzatore possa essere chiamato, specificato in J2SE 5.0, implementato in Java SE 6), rimane comunque un'area problematica. Se stai progettando un'API, assicurati che le classi sensibili non possano essere sottoclassi e risparmia loro molto dolore.
fonte
2009-06-16 20:16:14
+1 perché è una buona domanda, ma spero che questo sia stato solo un esercizio intellettuale. ;) –
non ti preoccupare, era :) –