Garbage Collection: limpia la memoria de los datos no utilizados para no sobrecargarla y seguir trabajando sin problemas.
Introducción al curso
Requisitos antes de empezar
Historia de JavaScript
JavaScript Engine
¿Cómo funciona el JavaScript Engine?
V8, el JavaScript Engine de Chrome
Profundizando en el Engine
Ejemplo de Objeto global y hoisting
Código de Ejecución
Memory Heap
Qué es Call Stack
Garbage Collection
Qué es Stack overflow
JavaScript Runtime
Qué es la asincronía en JavaScript
Recapitulación
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Convierte tus certificados en títulos universitarios en USA
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Diego De Granda
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.
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.
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.
Aportes 73
Preguntas 6
Garbage Collection: limpia la memoria de los datos no utilizados para no sobrecargarla y seguir trabajando sin problemas.
La referencia sutil/nada sutil a Stack Overflow xD
Garbage Collection -> implementa el Mark Sweep para las cosas que no se ocupa
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…
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).
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.
Muy por encima esta clase, siento mucho ser el que siempre critica pero acá no esta diciendo casi nada. Lo de Mark and Sweep nisiquiera lo explicó. A los que pasen por acá les recomiendo que mejor lean los comentarios y entren a los links que dejan sobre este tema. Te explican muy bien como funciona el Garbage Collection. Te dejo uno por acá: https://developer.mozilla.org/es/docs/Web/JavaScript/Gestion_de_Memoria
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… 😄
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
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úmero
var s = "azerty"; // reserva memoria para un string
var 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 contiene
var a = [1, null, "abra"];
function f(a){
return a + 2;
} // reserva memoria para una funcion (la cual es un objeto)
// las expresiones de función tambien reservan memoria para un objeto
someElement.addEventListener('click', function(){
someElement.style.backgroundColor = 'blue';
}, false);
En ocasiones al llamar a una función se reserva memoria para un objeto.
var d = new Date();
// reserva memoria para un elemento del DOM
var 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
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.
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.
Buena explicación, a veces no se necesitan muchos tecnicismos ni videos largos, basta con ir al grano como en esta clase y la idea se entiende a la perfección.
Como se maneja una estructura de datos inmutables: https://www.youtube.com/watch?time_continue=152&v=Wo0qiGPSV-s&feature=emb_title
GARBAGE COLLECTION.
In JavaScript exist a mark by default to erase the variables and values that we don’t use again or we overwrite. An example can be when a variable is redeclare or inside a low scope like a function where the variables are periodic.
In other languages is the coder who has to mark this variables and erase them to avoid a called “overflow”, literally a massive storage of variables within the “memory heap”.
Garbage Collection: limpia la memoria de los datos no utilizados para no sobrecargarla y seguir trabajando sin problemas.
Es importante saber esta clase de detalles para conocer como funciona el JS de fondo. Más allá de saber que hacen los elementos, importa mucho el lenguaje en sí.
¡¡¡Pregunta de entrevista técnica y te pueden descalificar por eso: Mark and Sweep!!!
Increíble, normalmente en otros lenguajes tienes que “unsetear” esos valores, algo genial es que, JavaScript también tiene una palabra reservada llamada “delete” que te da a ti la capacidad de hacer la limpieza manualmente ^^
En el lenguaje de programación C no existe un Garbage Collection
por defecto, así que a nosotros nos toca hacerlo a mano. Por eso es importante saber como funciona y como lidiar con eso.
Ciclo de vida de memoria
Sin importar el lenguaje de programación, el ciclo de memoria es casi siempre parecido al siguiente:
Reservar la memoria necesaria
Utilizarla (lectura, escritura)
Liberar la memoria una vez ya no es necesaria.
El primer y el segundo paso son explícitos en todos los lenguajes. El último paso es explícito en lenguajes de bajo nivel, pero es mayormente implícito en lenguajes de alto nivel como JavaScript
Hasta ahora no conocía la mayoría de los conceptos tocados, me interesa mucho saber a profundidad como trabaja un lenguaje de programación!
Entendido
Esto es automático? Cada cuánto está revisando si hay algo para eliminar?
Todos hemos cometido el error de un ciclo infinito jaja no sabía que fallaba por la Memory Heap
Podriamos decir que JS tiene un Garbge collection automatico o un mark sweep automatico?
Interesentate funcionamiento😊 sobre como gestiona memoria. Asi que GC encarga de identificar y eliminar la memoria ocupada por objetos que ya no están en uso por el programa. (Los recicla según entiendo)
En algunos lenguajes de programación tendremos que controlar la memoria ya que esta puede desbordarse y tenemos que preguntarnos en que momento necesitamos tirar todas las cosas que ya no ocupamos y hay que limpiar todo esto. Esto se llama Garbage Collection.
En JS esto se hace en dos pasos, una vez que haya detectado los elementos u objetos que ya no utilizamos, hace un Mark y después sweep a todo lo que no se ocupa. Esto JS nos lo hace de forma automática, pero hay que tener cuidado porque puede llegar un momento donde llenemos la memoria y rompamos el navegador
Mark-and-sweep = marcado y barrido
Garbage colletion = eliminar aquellos objetos que no tienen referencia al momento de ejecución
Diego me agrada, ya tomé varios cursos con él, PERO me parece muy básica la explicación, hay mucho que abarcar sobre este tema de Garbage Collection. Platzi se enfoca más en la cantidad de clases y cursos, que en la calidad de los mismos. Es una vergüenza que haya videos mejor editados y explicados en Youtube, que es prácticamente gratis !!.
Garbage Collection es como ella…cuando ya no tienes alguna referencia en su corazón, simplemente aplica el Sweep y da paso al siguiente 😛.
Es bastante bueno que JS se limpie solito, es como si una casa estuviera limpiandose constantemente, un milagro hecho realidad.
De alguna forma nos agiliza tanto tecnico como visualmente nuestro entorno, elimando el código obsoleto o que no se va a volver a usar
Los lenguajes de bajo nivel, como C, tienen primitivos de bajo nivel como malloc()
y free()
para la gestión de memoria. Por otro lado, para los valores en JavaScript se reserva memoria cuando"cosas" (objetos, strings, etc.) son creados y “automáticamente” liberados cuando ya no son utilizados. El proceso anterior es conocido como Recolección de basura (garbage collection). Su forma “automática” es fuente de confusión, y da la impresión a los desarrolladores de JavaScript (y de otros lenguajes de alto nivel) de poder ignorar el proceso de gestión de memoria. Esto es erróneo.
Fuente ()[https://developer.mozilla.org/es/docs/Web/JavaScript/Memory_Management]
Mega interesante, Ósea que si hay algo que no necesito se elimina del Root Set, pero esto se podría recuperar o eso no es posible? hay forma de leer lo que esta en Mark?
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).
Buenas, como estan! Les comparto mi carpeta de Google Docs para que entre todos podamos seguir aportando a la toma de notas de un montón de los cursos de Platzi. Hagamos una comunidad!!!
https://drive.google.com/drive/folders/1SWGMgTMPbwgasbzcivcpcnIudc2vk_v0?usp=sharing
Articulo que nos ayudara a comprender mejor este proceso.
https://dev.to/supminn/garbage-collection-in-javascript-56e0
En lenguajes como C / C++, uno como desarrollador tiene que encargarse del Garbage Collection
Ejemplo:
Cuando nombras una variable y luego cambias ese valor. El Garbage collector se encargará de tomar la información antigua y recolectarla para liberar espacio en memoria. Dejando solamente la información que estás utilizando, en el caso de la variable, el último valor asignado.
Cunado el engine detecta elementos que ya no son utilizado hace un mark and sweep para liberar espacio de memoria por ejemplo la reasignación de una variable
let primero = "Uno";
primero = 1
/*Se reasigna el primer indicador con el string
y se elimina en el proceso de mark and sweep
quedando el valor entero*/
var carro = {
marca: "Toyota",
modelo: "2020"
}
carro = "Mio";
Los lenguajes de alto nivel como JavaScript hacen uso de una herramienta llamada Garbage Collector (recolector de basura). Esta herramienta hace uso del algoritmo Mark & Sweep para retirar los datos que ya no se están utilizando en memoria y retirar ese espacio para evitar que el programa vaya lento.
El algoritmo Mark & Sweep consiste en que primero realiza un proceso de marcado (mark) a los espacios, variables, objetos que no se están utilizando en la memoria y los barre (sweep).
Desde el 2012, todos los navegadoras han estado usando esta herramienta con el algoritmo de mark & sweep.
¿Cómo funciona realmente este algoritmo?
Este algoritmo hace referencia a cuando un objeto se vuelve inalcanzable en el programa, es decir, cuando un objeto ya no está referenciado. Esto significa que si tenemos una variable con cierto valor y luego le asignamos otro valor, destruye la variable con el anterior valor y crea una nueva con el valor que le asignamos.
Esto significa que si tenemos un objeto con el valor 3 y luego asignamos este objeto nuevamente con el valor 5, lo que hace garbage collector es destruir el objeto 3 y crear el mismo objeto con el valor 5, liberando el espacio que tenía en memoria el objeto 3.
para complementar los recomiendo este increible articulo hablando de como funciona la memoria en js
JavaScript’s Memory Management Explained
Garbage collection: Proceso de rastrear “variables, funciones y cosas que ya no ocupas” y limpiar la memoria.
Mark: Marca los espacios de memoria no utilizados
Sweep: Hace el barrido, los elimina.
Genial!
No tenía ni idea del concepto de Garbage Collection, pero ahorá sé a grandes rasgos para que sirve
Excelente.
Genial. que gran clase
Momento exacto donde se demuestra que Diego está haciendo el curso de programación básica xd
Buena info neni
Muy bueno!
Se que no adopte buenas practicas, pero para q se vea mejor. Una duda que me surgio es como actuaba estode borrar las Variables, y si se ejecuta ese codigo primero utiliza la Var cosa = 1 en la funcion y luego 112233… borrando el 1.
var cosa = 1;
function f1 (){
console.log(cosa)
}
f1();
cosa = 112233;
f1();
f
Yo soy experto en hacer crashear el navegador jaja 😥
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?