JavaRush /Blog Java /Random-ES /Recolector de basura en Java
Diana
Nivel 41

Recolector de basura en Java

Publicado en el grupo Random-ES

Línea de comportamiento del recolector de basura (recuperador de memoria)

El programador de Java no necesita monitorear la asignación de memoria porque el recolector de basura administra la memoria automáticamente. El recolector de basura lo ejecuta la máquina virtual Java (JVM). El recolector de basura es un proceso de baja prioridad que se ejecuta periódicamente y libera memoria utilizada por objetos que ya no son necesarios. Diferentes JVM tienen diferentes algoritmos de recolección de basura. Se utilizan varios algoritmos, por ejemplo: algoritmo de recuento de referencias o algoritmos de marcado y raspado.Recolección de basura - 1

Ejecutando el recolector de basura en Java

La JVM normalmente ejecuta el recolector de basura cuando hay poca memoria libre. Pero el funcionamiento del recolector de basura no garantiza que siempre habrá suficiente memoria libre. Si no hay suficiente memoria incluso después de la recuperación, la JVM genera una excepción OutOfMemoryError. Tenga en cuenta que la JVM debe ejecutar el recolector de basura al menos una vez antes de generar una excepción. Puede solicitar que el recolector de basura se ejecute en Java, pero no puede forzar esta acción.

Solicitud para ejecutar el recolector de basura

Para realizar una solicitud, puede llamar a uno de los siguientes métodos:
System.gc()
Runtime.getRuntime().gc()

Idoneidad para ejecutar el recolector de basura.

Un objeto debe ser eliminado cuando ya no esté disponible para la corriente viva. Un objeto puede estar sujeto a disposición en diferentes casos:
  • Si una variable de un tipo de referencia que hace referencia a un objeto se establece en "0", el objeto debe eliminarse si no hay otras referencias a él.
  • Si se crea una variable de un tipo de referencia que hace referencia a un objeto para hacer referencia a otro objeto, el objeto debe eliminarse si no hay otras referencias a él.
  • Los objetos creados localmente en un método se descartan cuando el método sale, a menos que se exporten desde ese método (es decir, se devuelvan o se lancen como una excepción).
  • Los objetos que hacen referencia entre sí pueden estar sujetos a eliminación si ninguno de ellos está disponible para el hilo activo.
Veamos un ejemplo:
public class TestGC
  {
    public static void main(String [] args)
    {
      Object o1 = new Integer(3);               // Line 1
      Object o2 = new String("Tutorial");       // Line 2
      o1 = o2;                                  // Line 3
      o2 = null;                                // Line 4
      // Rest of the code here
    }
  }
En este ejemplo Integer, el objeto (entero) al que originalmente hace referencia o1 se puede eliminar después de la línea 3 porque o1 ahora se refiere al objeto String(cadena). Aunque o2 se crea para hacer referencia a nulo, el objeto String(cadena) no es reciclable ya que o1 se refiere a él.

Finalización

La tecnología Java le permite utilizar un método finalize()(finalizar) para realizar la limpieza necesaria antes de que el recolector de basura recupere un objeto de la memoria. El recolector de basura llama a este método en un objeto cuando determina que no hay más referencias al objeto. Esto se describe en la clase Object, lo que significa que todas las clases lo heredan. La subclase anula el método finalize()para liberarse de los recursos del sistema o para otra limpieza:
protected void finalize() throws Throwable
Si el método genera una excepción no registrada finalize(), la excepción se ignora y se detiene la finalización de ese objeto. El método finalize()sólo será invocado una vez durante la vida del objeto. Es posible utilizar un método finalize()en cualquier objeto para protegerlo de su eliminación. Pero en este caso, el recolector de basura ya no está activado finalize()para este objeto. El método finalize()siempre se invocará una vez antes de que el objeto sea recolectado como basura. Sin embargo, es posible que el método finalize()no se active para un objeto determinado durante toda su existencia, ya que es posible que no esté sujeto a eliminación.

Resumen

En esta sección, analizamos el proceso de recolección de basura, que es una técnica de administración de memoria en el lenguaje Java. No se puede forzar la recogida de basura. Aprendimos sobre las diferentes formas de hacer que los objetos sean elegibles para el reciclaje y aprendimos que el método finalize()se invoca antes de que el recolector de basura reclame el objeto.

Ejercicio

Pregunta: ¿Cuántos objetos estarán sujetos a eliminación después de la línea 7?
public class TutorialGC
  {
    public static void main(String [] args)
    {
      Object a = new Integer(100);  // Line1
      Object b = new Long(100);     // Line2
      Object c = new String("100"); // Line3
      a = null;                     // Line4
      a = c;                        // Line5
      c = b;                        // Line6
      b = a;                        // Line7
      // Rest of the code here
    }
  }
Opciones de respuesta: A. 0 B. 1 C. 2 D. 3 E. El código no se puede compilar Opción correcta: B Explicación: De los tres objetos creados en las líneas 1, 2 y 3, solo el objeto Integerdebe eliminarse en el final de la línea 7. Las referencias a variables, a, que originalmente hacían referencia al objeto Integer, hacen referencia al objeto Stringen la línea 5. Por lo tanto, Integerel objeto debe eliminarse después de la línea 5, ya que no hay variables que lo hagan referencia. Las variables by cse refieren a objetos Stringy Longobjetos de las líneas 6 y 7, por lo que no son reciclables.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION