Recolección de basura en JavaScript

Este artículo explicará el concepto de recolección de basura en JavaScript. Para comprender la necesidad de la recolección de basura, primero debemos comprender el ciclo de vida de la memoria

Ciclo de vida de la memoria: el ciclo de vida de la memoria es prácticamente el mismo para cualquier lenguaje de programación, tiene 3 pasos principales.

  • Asignar la memoria.
  • Utilice la memoria asignada para leer, escribir o ambas cosas.
  • Libere la memoria asignada cuando ya no sea necesaria.

Una descripción general detrás de la recolección de basura: la mayoría de los problemas de administración de memoria ocurren cuando intentamos liberar la memoria asignada. La principal preocupación que surge es la determinación de los recursos de memoria no utilizados. En el caso de los lenguajes de bajo nivel en los que el desarrollador tiene que decidir manualmente cuándo ya no se necesita la memoria, los lenguajes de alto nivel como JavaScript utilizan una forma automatizada de administración de memoria conocida como Garbage Collection (GC).

Recolección de basura: La siguiente sección explicará los conceptos que son necesarios para comprender los principales algoritmos de recolección de basura y sus limitaciones. El concepto principal de los algoritmos diseñados para la recolección de basura es el concepto de referencia . Un objeto puede tener una referencia a otro objeto si el objeto anterior tiene acceso a este último . Por ejemplo, un objeto de JavaScript puede tener una referencia implícita (cuando la referencia es a sus prototipos) y explícita (cuando la referencia es a los valores de sus propiedades).
A continuación, explicaremos los algoritmos utilizados para la recolección de basura.

  1. Recolección de basura de conteo de referencias: este algoritmo se considera el tipo más básico de algoritmo de recolección de basura. Lo que hacen estos algoritmos es que, en lugar de determinar si algún recurso es importante o no, escanea la memoria para determinar si un objeto tiene otros objetos que se refieren a él. Un objeto con cero referencias se considera basura o «coleccionable».

    Ejemplo:

    javascript

    // Consider the following example
      
    // Declare an object
    var object_1 = {
        object_2: {
            object_3: 7
        }
    };
      
    // In this example, create two objects
    // One object is referred by another 
    // as one of its properties. Currently, 
    // none can be garbage collected
      
    // The "object_4" variable is the second
    // thing that has a reference to the object
    var object_4 = object_1;
      
    // The object that was originally in 
    // "object_1" has a unique reference 
    // embodied by the "object_4" variable
    object_1 = 1;
      
    //Reference to "object_2" property of
    // the object. This object now has 2 
    // references: 1 as a property,
    // The other as the "object_5" variable.
    var object_5 = object_4.object_2;
      
    // The object that was in "object_1" has
    // now zero references to it. It can be 
    // garbage-collected. However its "object_2"
    // property is still  referenced by the
    // "object_5" variable, so it cannot be freed.
    object_4 = "Geeks For Geeks";
      
    // Now the "object_2" property has no 
    // references to it and hence it can
    // be garbage collected.
    object_5 = null;

    Obstrucciones: Referencias circulares

    Las limitaciones surgen cuando se trata de referencias circulares. Una referencia circular ocurre cuando se crean dos objetos con propiedades que se refieren entre sí, creando así un ciclo. 
    El algoritmo de conteo de referencias no puede reclamar estos recursos de memoria ya que cada objeto tiene al menos una referencia que los señala, lo que evita que ambos objetos se marquen para la recolección de elementos no utilizados. Las referencias circulares son una de las principales causas de pérdidas de memoria.
    El siguiente ejemplo muestra una instancia de dicho caso.

    Ejemplo:

    javascript

    function Demo() {
        var one = {};
        var two = {};
      
        // one reference to two
        one.object = two;
      
        // two reference to one
        two.object = one;
      
        return 'circular';
    }
      
    Demo();
  2. Mark-and-sweep-algorithm: este algoritmo modifica la declaración del problema de «objeto que ya no se necesita» a «inalcanzable». Este algoritmo exige como requisito previo el conocimiento de las raíces que son un conjunto de objetos. En JavaScript, una raíz es un objeto global. Regularmente, el recolector de elementos no utilizados comienza desde estas raíces y encuentra todos los objetos a los que se hace referencia desde estas raíces, luego todos los objetos a los que se hace referencia desde estos, etc. A partir de las raíces, el recolector de elementos no utilizados encontrará todos los objetos a los que se puede acceder y marcar todos los objetos no alcanzables.
     
  3. Los ciclos ya no son un problema: después de que regresa la llamada a la función, ningún recurso al que se pueda acceder desde la raíz o el objeto global ya no hace referencia a los dos objetos. Por lo tanto, estos serán marcados como inalcanzables por el recolector de elementos no utilizados y recuperarán su memoria asignada.
     

    Algunas limitaciones: la única limitación que se puede encontrar es que no es posible activar explícita o programáticamente el recolector de basura en JavaScript.
    Por lo tanto, si hay casos en los que sería conveniente programar manualmente cuándo liberar memoria, no hay disposiciones en JavaScript para desenstringr tal evento.
     

Publicación traducida automáticamente

Artículo escrito por kevadiyasmeet y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *