A diferencia de los lenguajes de bajo nivel como C, JavaScript asigna memoria automáticamente cuando se crean objetos y la libera cuando ya no se usa (recolección de basura). C tiene técnicas de administración de memoria como malloc() y free(). Esto no significa que no debamos preocuparnos por la administración de memoria en JavaScript.
Ciclo de vida de la memoria: independientemente del lenguaje de programación, el ciclo de vida de la memoria sigue las siguientes etapas:
- Asigna la memoria que necesitamos: JavaScript asigna memoria al objeto creado.
- Utilice la memoria asignada.
- Liberar la memoria cuando no esté en uso: una vez que se libera la memoria asignada, se utiliza para otros fines. Es manejado por un motor de JavaScript.
La segunda etapa es la misma para todos los idiomas. Sin embargo, la primera y la última etapa están implícitas en lenguajes de alto nivel como JavaScript.
Nota: “ Objetos ” en este contexto no solo significa objetos en JavaScript sino también funciones y ámbitos de funciones.
Los motores de JavaScript tienen dos lugares para almacenar datos:
- Pila: Es una estructura de datos utilizada para almacenar datos estáticos. Los datos estáticos se refieren a datos cuyo tamaño conoce el motor durante el tiempo de compilación. En JavaScript, los datos estáticos incluyen valores primitivos como strings, números, booleanos, nulos e indefinidos. También se incluyen referencias que apuntan a objetos y funciones. Se asigna una cantidad fija de memoria para datos estáticos. Este proceso se conoce como asignación de memoria estática.
- Heap: Se utiliza para almacenar objetos y funciones en JavaScript. El motor no asigna una cantidad fija de memoria. En su lugar, asigna más espacio según sea necesario.
Visión general:
Pila |
Montón |
Tipos de datos primitivos y referencias | Objetos y funciones |
El tamaño se conoce en tiempo de compilación | El tamaño se conoce en tiempo de ejecución |
Memoria fija asignada | Sin límite para la memoria de objetos |
Ejemplo:
Javascript
const employee = { name: 'Rajesh', age: 30, }; // Allocates memory for object in heap.Values // in object are primitive,which is why they // are stored in stack. const sports = ['cricket', 'football','badminton']; //Arrays are object.It is stored in heap. let name = 'Rajesh'; // allocates memory for a string const age = 30; // allocates memory for a number name = 'Raj'; // allocates memory for a new string // Primitives are immutable.Thus,new memory is allocated // when new value is assigned.
Explicación: En el ejemplo anterior, el objeto ‘empleado’ se crea en el montón y se hace referencia a él en la pila.
Recolección de basura: los recolectores de basura se utilizan para liberar memoria. Una vez que el motor reconoce que una variable, objeto o función ya no es necesaria, libera la memoria que ocupaba. El problema principal aquí es que es muy difícil predecir con precisión si una variable, objeto o función en particular ya se necesita o no. Algunos algoritmos ayudan a encontrar el momento en que quedan obsoletos con gran precisión.
Recolección de basura de conteo de referencias: Libera la memoria asignada a los objetos que no tienen referencias que los apunten. Sin embargo, el problema de este algoritmo es que no entiende las referencias cíclicas.
Ejemplo:
Javascript
let game = { name: 'cricket', }; let boy = { name: 'Ram', } game.boy = boy; bpy.game = game; boy = null; game = null;
Explicación: En este ejemplo, el juego y el niño se refieren mutuamente. Por lo tanto, el algoritmo no liberará la memoria asignada. Establecerlos en nulos no hará que el algoritmo se dé cuenta de que ya no se pueden usar, lo que no permitirá la liberación de la memoria asignada.
Algoritmo de marcado y barrido: este algoritmo resuelve el problema mencionado anteriormente. En lugar de encontrar referencias a un objeto en particular, detecta si son accesibles desde el objeto raíz.
Nota: en JavaScript, la raíz es el objeto de la ventana, mientras que en NodeJS es el objeto global.
El algoritmo marca los objetos que no son accesibles como basura y los recopila (barre). Por lo tanto, se conoce como algoritmo Mark and Sweep. En el ejemplo anterior, no se puede acceder ni al juego ni al objeto chico desde el objeto raíz. Por lo tanto, se marca como basura y se recolecta después.
Publicación traducida automáticamente
Artículo escrito por priddheshinternship y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA