Dado que Java es un lenguaje y plataforma seguros, la memoria no se libera. También asociado PhantomReference
s no se pondrá en cola en su ReferenceQueue
s. La VM solo llamará al finalize
en un objeto una vez. Hay un buen diagrama de estado en la especificación de JVM.
Normalmente, si utiliza un finalizador, debe dejar la declaración como @Override protected void finalize() throws Throwable
, para no molestar a la API. Mejor aún use un finalizador protegido, como en Effective Java 1st Ed.
Este truco particular llegó a los titulares (del San Jose Mercury, de todos modos) cuando un grupo en Princeton lo usó para construir un ClassLoader
personalizado del código que no era de confianza. Aunque la especificación ha sido ligeramente ajustada (el constructor Object
tiene que terminar ejecutando normalmente antes de que se pueda llamar al finalizador, especificado en J2SE 5.0, implementado en Java SE 6), este sigue siendo un área problemática. Si está diseñando una API, asegúrese de que las clases sensibles no puedan ser subclases y ahórrese mucho dolor.
+1 porque es una buena pregunta, pero espero que esto sea solo un ejercicio intelectual. ;) –
no se preocupe, fue :) –