Garbage Collection es un proceso automático realizado por el motor de JavaScript que consiste en eliminar aquellos objetos que no tienen referencias o son inalcanzables para el contexto de ejecución, a través del algoritmo mark-and-sweep (marcado y barrido).
El Garbage Collection es importante para liberar aquellas referencias en memoria y no exista un desbordamiento en las tareas (Stack overflow). Por ejemplo, un ciclo infinito que provoque el colapso de la página web.
Algoritmo marcado y barrido
El algoritmo marcado y barrido (mark-and-sweep) hace referencia a cuando un tipo de dato se vuelve inalcanzable para el programa. El motor de JavaScript empieza por la raíz, la cual es el Objeto Global, a medida que el programa avanza los objetos van creando o borrando referencias a sus raíces.
Cuando un objeto se queda ninguna referencia, se dice que el objeto es inalcanzable, en este momento el Garbage Collection libera el espacio que usaban las variables u objetos cuando aún tenían una referencia.
Desde 2012, los navegadores utilizan un Garbage Collection, que ha ido recibiendo mejoras en su implementación constantemente.
Ejemplo que actúa el Garbage Collection
En este punto de tu estudio, ya conocerás los métodos shift y pop de arrays, puede que los hayas entendido como eliminar el primer y último elemento de un array, respectivamente.
Pues no funcionan exactamente como "eliminar", sino como extraer el primer y último elemento, pero si no lo guardamos en una variable, el Garbage Collection lo eliminará.
const array =[1,2,3,4,5]// Extrae el último elemento, guarda la referencia en la variable lastElement.const lastElement = array.pop()console.log(lastElement)//5
const array =[1,2,3,4,5]// Extrae el último elemento, pero no existe la referencia, entonces el Garbage Collection lo eliminaráarray.pop()console.log(array)// [1,2,3,4]
Por lo tanto, el que elimina ese valor, es el Garbage Collection.
Contribución creada por Andrés Guano, con aportes de Sergio Estrella y Nathaly Stefani Riaño Bejarano.
Garbage Collection: limpia la memoria de los datos no utilizados para no sobrecargarla y seguir trabajando sin problemas.
Si hace el proceso de Mark and Sweep para limpiar estas variables que fueron renombradas como dice degranda , Cuando hay un ciclo for las variable siempre se renombrar y las anteriores se quedan hay pero bueno para eso esta Garbage collection que limpia estas variables inservibles.
increíble, todo lo que hace el V8
#Cool
muy buen gif
La referencia sutil/nada sutil a Stack Overflow xD
Garbage Collection -> implementa el Mark Sweep para las cosas que no se ocupa
Mark and sweep algorithm reduces the definition of "an object is no longer needed" to "an object is unreachable".
Garbage collecction es el proceso de rastrear los "desechos" y limpiar la memoria(Mark and Sweep) para evitar un overstack.
Mark and sweep es el proceso en el que marca(mark) los espacios de memoria no utilizados en el heap y los elimina(sweep).
Entonces, llegamos a lo mismo...
¡Es mejor no usar var para declarar una variable! Es mejor usar const o let para no redefinir una variable que no queramos que cambie...
pilas, que en el ejemplo el profe está reasignando(volviendo a asignar) el valor de una variable, habiendo dicho eso, lo que dices (no reasignar) únicamente se puede lograr declarando la variable con const, ya que con let sí se puede reasignar una variable … por otro lado, lo que sí no se puede hacer con estas dos es redefinir una variable, es decir:
.
let miVariable ="algo";let miVariable ="otra cosa";// lanza error, y lo mismo sucede con const
.
mientras que:
let miOtraVariable ="algo";miOtraVariable ="otra cosa";// es correcto
Qué buena explicación y complemento de los comentarios jeje
JS es un lenguaje recolector de basura, es decir, el contexto de ejecución es responsable de la memoria requerida durante la ejecución del código. Esta característica libera a los desarrolladores de la preocupación acerca de la administración de la memoria. Lo que hace es alojar lo que es necesario y reclama la memoria que ya no está siendo usada.
El Garbage Collection: Durante el proceso de ejecución de javascript en nuestro navegador, habrá un algorimo que estará pendiente del estado del memory heap cuyo trabajo sera buscar y eliminar datos no necesarios y asi liberarar espacio para la memoria, esto es muy util para que una variable pueda ser renombrada con una dato mucho mas nuevo. El garbage collection es muy importante debido a que con ella podemos recolectar o almacenar datos que el navegador no usa pero que a futuro podamos usarlo para nuestro fin.
En pocas palabras como JS tiene un Garbage collector automático, no hay necesidad de preocuparse mucho por él... :D
pero es una buena practica que tu mismo hagas una limpieza de memoria
Enterado. Al igual, hay que comprender de que va.
¿No debería decirse Garbage Collector en vez de Garbage Collection? (En java es Garbage Collector)
La única diferencia es gramatical :confused: Collector el que recoge la basura, y Collection el acto de recogerla.
:D ¡Saludos!
¡Hola! En realidad "Collection" no es una acción o verbo, es un sustantivo, una colección, por lo que sí, al decir "Garbage Collection" estamos diciendo "Colección de basura", por lo que, tal como indicas, sería mejor decir "Garbage Collector".
¡Saludos!
No había visto apuntes en ningún curso con animaciones....este de V8 esta repleto de excelentes animaciones
GARBAGE COLLECTION
para barrer con variables que ya no usamos
mark
sweep
Ok, esto funciona por default
Este es el gif del profe:
.
Encontré este otro, no se si hace referencia a la memoria Heap:
Garbage Collection: Limpia la memoria con los datos que no son usados.
Mark and Sweep: Periódicamente se va recorriendo desde el objeto global (window) hacia todas sus raíces de esta forma sabe que objeto es alcanzable y cuales son los inalcanzables (un objeto sin referenciar es inalcanzable) y simplemente borra los inalcanzable
Reserva de memoria en JavaScript
Inicialización de valores
Para no agobiar al programador con reservas de memoria, JavaScript las realiza al mismo tiempo que la declaración de los valores.
var n =123;// reserva memoria para un númerovar s ="azerty";// reserva memoria para un stringvar o ={a:1,b:null};// reserva memoria para un objeto y los valores que// contiene// (similar a objeto) reserva memoria para el arreglo y// los valores que contienevar a =[1,null,"abra"];functionf(a){return a +2;}// reserva memoria para una funcion (la cual es un objeto)// las expresiones de función tambien reservan memoria para un objetosomeElement.addEventListener('click',function(){ someElement.style.backgroundColor='blue';},false);
Reserva de memoria al llamar una función
En ocasiones al llamar a una función se reserva memoria para un objeto.
var d =newDate();// reserva memoria para un elemento del DOMvar e =document.createElement('div');
Algunos métodos reservan memoria para nuevos valores u objetos:
var s ="azerty";var s2 = s.substr(0,3);// s2 es un nuevo string// Como los strings son valores inmutables,// JavaScript puede NO reservar memoria para este,// y solo almacenar el rango [0, 3].var a =["ouais ouais","nan nan"];var a2 =["generation","nan nan"];var a3 = a.concat(a2);// nuevo arreglo con 4 elementos resultado de// concatenar los elementos de a y a2
Liberar la memoria cuando ya no es necesaria
En este punto ocurren la mayoria de los inconvenientes con la gestión de memoria. Lo más díficil es encontrar el cuándo la "memoria ya no es necesaria". En algunas ocasiones, es necesario que el desarrollador determine en qué parte de un programa esa parte de memoria ya no es necesaria y la libere.
Los lenguajes de alto nivel incluyen una herramienta de software conocida como "recolector de basura" (garbage collector), cuya función es rastrear las reservas de memoria y su utilización, para así encontrar cuándo cierta parte de la memoria ya no es necesaria, y en su momento liberarla automáticamente. Este proceso es sólo una aproximación al problema general de saber cuándo una parte de la memoria ya no es necesaria, ya que éste es indecidible (no puede ser resuelto por un algoritmo).
Ref. JS Memory Management
El algoritmo de marcado y barrido se denomina recolector de basura de rastreo porque rastrea la colección completa de objetos a los que el programa puede acceder directa o indirectamente.
¿Cada cuánto se manda a llamar el garbage collector?
V8 lo llama cuando ve valores y/o variables que ya no se pueden acceder.
He buscado pero no he encontrado nada, ¿hay manera de liberar memoria de manera manual en JavaScript?
Para el caso de las variables entiendo que las podemos definir a null cuando ya no la estemos utilizando para asi liberar memoria, aunque entiendo que en memoria se quedará ahora ese valor null
Entonces, el Garbage Collector nos ayuda a limpiar la memoria de los datos ya no se utilizan, JavaScript nos ayuda con esta parte usando Mark and Sweep que se aplica cuando una variable es renombrada, deja de guardar ese dato para no saturar el Stack
Ojala y no este mal, pero el hecho de que usemos **const **y **let **nos permite que el Garbage Collection haga Mark & Sweep cada que son llamadas, de esta manera desocupamos la memoria cada vez que salimos del scope.