Pregunta

si llamo finalize() en un objeto de mi código de programa, ¿el JVM ¿Aún ejecutas el método nuevamente cuando el recolector de basura procesa este objeto?

Este sería un ejemplo aproximado:

MyObject m = new MyObject();

m.finalize();

m = null;

System.gc()

¿El llamado explícito a finalize() hacer el JVMel recolector de basura no ejecute el finalize() método en objeto m?

¿Fue útil?

Solución

De acuerdo con este sencillo programa de prueba, la JVM seguirá realizando su llamada a finalize() incluso si lo llamaste explícitamente:

private static class Blah
{
  public void finalize() { System.out.println("finalizing!"); }
}

private static void f() throws Throwable
{
   Blah blah = new Blah();
   blah.finalize();
}

public static void main(String[] args) throws Throwable
{
    System.out.println("start");
    f();
    System.gc();
    System.out.println("done");
}

La salida es:

comenzar
finalizando!
finalizando!
hecho

Todos los recursos que existen dicen que nunca se debe llamar a finalize() explícitamente y prácticamente nunca implementar el método porque no hay garantías de si se llamará y cuándo.Es mejor que cierres todos tus recursos manualmente.

Otros consejos

Es necesario comprender el flujo de trabajo del recolector de basura (GC) para comprender la función de finalización.llamar a .finalize() no invocará al recolector de basura ni llamará a system.gc.En realidad, lo que finalizar ayudará al codificador es declarar la referencia del objeto como "sin referencia".

GC fuerza una suspensión de la operación en ejecución de JVM, lo que afecta el rendimiento.Durante la operación, GC atravesará todos los objetos referenciados, comenzando desde el objeto raíz (su llamada al método principal).Este tiempo de suspensión se puede reducir declarando los objetos como sin referencia manualmente, ya que reducirá los costos de operación para declarar la referencia del objeto obsoleta mediante la ejecución automatizada.Al declarar finalize(), el codificador establece la referencia al objeto obsoleto, por lo tanto, en la siguiente ejecución de la operación de GC, la ejecución de GC barrerá los objetos sin usar el tiempo de operación.

Cita:"Después de que se ha invocado el método de finalización para un objeto, no se realizan más acciones hasta que la máquina virtual Java haya determinado nuevamente que ya no hay ningún medio por el cual ningún subproceso que aún no haya muerto, incluidos los posibles, pueda acceder a este objeto acciones de otros objetos o clases que están listas para ser finalizadas, momento en el cual el objeto puede ser descartado." del documento API de Java en java.Object.finalize();

Para obtener una explicación detallada, también puede consultar: javabook.computerware

Una JVM nunca invoca el método finalize más de una vez para un objeto determinado.No deberías confiar en finalizar de todos modos porque no hay garantía de que se invoque.Si llama a finalizar porque necesita ejecutar código de limpieza, entonces es mejor ponerlo en un método separado y hacerlo explícito, por ejemplo:

public void cleanUp() {
  .
  .
  .
}

myInstance.cleanUp();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top