Antes que nada, recuerde que no hay garantía de que la finalización se ejecute en absoluto para todos sus objetos. Puede usarlo para liberar memoria asignada en código nativo asociado con un objeto, pero para código Java puro la mayoría de los casos de uso son solo para realizar un mecanismo de "copia de seguridad" de limpieza de recursos. Esto significa que en la mayoría de los casos debe liberar recursos manualmente y los finalizadores podrían actuar solo como un tipo de ayudante para limpiar si olvida hacerlo de la manera estándar. Sin embargo, no puede usarlos como el único o principal mecanismo de limpieza. Incluso más generalmente, no debe escribir ningún código cuya corrección dependa de los finalizadores que se ejecutan.
Anuncio 1.Por lo que yo sé, no hay garantías sobre qué hilo llama a finalize()
, aunque en la práctica probablemente sea uno de los hilos de GC.
Anuncio 2. Se permite la instanciación de objetos nuevos. Sin embargo, hay una serie de dificultades con el manejo de referencias de objetos en los finalizadores. En particular, si almacena una referencia difícil al objeto que se está finalizando en algún objeto activo, puede evitar que se limpie el objeto que se va a recoger. Este tipo de resurrección de objetos puede llevar a agotar sus recursos si se sale de control. Además, tenga cuidado con las excepciones en finalize()
; pueden detener la finalización, pero no hay una manera automática de que su programa las conozca. Debe envolver el código en bloques de prueba y propagar la información usted mismo. Además, el tiempo de ejecución prolongado de los finalizadores puede hacer que la cola de objetos se acumule y consuma mucha memoria. Algunos otros problemas y limitaciones notables se describen en this JavaWorld article.
Anuncio 3. No debería haber ningún problema al llamar a los métodos estáticos desde los finalizadores.
Anuncio 4. Como se menciona en el punto 2, es posible evitar que un objeto sea recolectado como basura (para resucitarlo) al colocar una referencia en otro objeto activo durante la finalización. Sin embargo, este es un comportamiento difícil y probablemente no una buena práctica.
En resumen, no puede confiar en los finalizadores para limpiar sus recursos. Debe manejarlo de forma manual y los finalizadores en su caso pueden, en el mejor de los casos, utilizarse como un mecanismo de copia de seguridad para cubrirse después de una codificación descuidada hasta cierto punto. Esto significa que, desafortunadamente, su idea de mejorar la API mediante el uso de finalizadores para limpiar los recursos de OpenGL probablemente no funcione.
Esta no es una respuesta directa a su pregunta, pero sepa que finalizar no está garantizado y que es una de las muchas razones por las que no se usa mucho. (EDITAR: e incluso si lo es, se llamará debido a la presión de la memoria en la memoria administrada por Java. Eso significa que si está intentando usarlo para liberar otros recursos, entonces puede quedarse sin ellos y tener el programa se bloquea aunque la limpieza podría reclamarlos a todos, solo porque Java no sabe que ejecutar el GC reclamará (por ejemplo) identificadores de archivos). – jacobm