studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java garbage-collection finalize

java - para - manual de programacion android pdf



Java y ejecutar manualmente finalizar (3)

De acuerdo con este programa de prueba simple, la JVM seguirá realizando su llamada para finalizar () incluso si lo llamó 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"); }

El resultado es:

comienzo
finalizando!
finalizando!
hecho

Cada recurso dice que nunca se debe llamar a finalize () explícitamente, y prácticamente nunca se implementa el método porque no hay garantías de cuándo y cuándo se llamará. Es mejor que simplemente cierre todos sus recursos manualmente.

Si llamo a finalize() sobre un objeto desde mi código de programa, ¿la JVM seguirá ejecutando el método nuevamente cuando el recolector de basura procese este objeto?

Este sería un ejemplo aproximado:

MyObject m = new MyObject(); m.finalize(); m = null; System.gc()

¿La llamada explícita para finalize() haría que el recolector de basura de la JVM no ejecutara el método finalize() en el objeto m ?


El método de finalización nunca es invocado más de una vez por una JVM para ningún objeto dado. No debe confiar en finalizar de todos modos porque no hay garantía de que se invocará. Si llama a finalizar porque necesita ejecutar el código de limpieza, es mejor ponerlo en un método aparte y hacerlo explícito, por ejemplo:

public void cleanUp() { . . . } myInstance.cleanUp();


Uno debe entender el Flujo de trabajo del recopilador de basura (GC) para comprender la función de finalizar. Llamar a .finalize () no invocará al recolector de basura, ni llamará a system.gc. En realidad, lo que finalice ayudará al codificador a declarar la referencia del objeto como "sin referencia".

GC fuerza una suspensión en la operación de JVM, lo que crea una mella en el rendimiento. Durante la operación, GC recorrerá todos los objetos referenciados, comenzando desde el objeto raíz (su llamada al método principal). Este tiempo de suspensión se puede reducir al declarar los objetos como no referenciados manualmente, ya que reducirá los costos de operación para declarar la referencia del objeto obsoleta por 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 del GC, la ejecución del GC barrirá los objetos sin utilizar el tiempo de operación.

Cita: "Después de invocar 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 que se pueda acceder a este objeto por un hilo que aún no haya muerto. incluyendo acciones posibles por otros objetos o clases que están listas para ser finalizadas, en cuyo punto el objeto puede ser descartado. "de Java API Doc en java.Object.finalize ();

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