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
You don't have access to this class
Keep learning! Join and start boosting your career
Garbage Collection is an automatic process performed by the JavaScript engine that consists of eliminating those objects that have no references or are unreachable for the execution context, through the mark-and-sweep algorithm.
The Garbage Collection is important to free those references in memory and not to have an overflow in the tasks (Stack overflow). For example, an infinite cycle that causes the collapse of the web page.
The mark-and-sweep algorithm refers to when a data type becomes unreachable for the program. The JavaScript engine starts at the root, which is the Global Object, and as the program progresses, objects create or delete references to their roots.
When an object has no reference, it is said that the object is unreachable, at this moment the Garbage Collection frees the space used by the variables or objects when they still had a reference.
Since 2012, browsers use a Garbage Collection, which has been receiving improvements in its implementation constantly.
At this point in your study, you will already know the shift
and pop
methods of arrays, you may have understood them as removing the first and last element of an array, respectively.
Well, they don't work exactly like "delete", but like extracting the first and last element, but if we don't store it in a variable, the Garbage Collection will delete it.
const array = [1,2,3,4,5]// Extract the last element, save the reference in the variable lastElement.const lastElement = array.pop()console.log(lastElement) //5
const array = [1,2,3,4,5]// Extracts the last element, but the reference does not exist, then the Garbage Collection will delete itarray.pop()console.log(array) // [1,2,3,4].
Therefore, the one that eliminates that value, is the Garbage Collection.
Contribution created by Andrés Guano, with contributions from Sergio Estrella and Nathaly Stefani Riaño Bejarano.
Contributions 73
Questions 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
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…
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… 😄
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 😥
Want to see more contributions, questions and answers from the community?