JavaScript: Gerenciamento de memória

Faz algum tempo que estou estudando o JavaScript um pouco mais a fundo, e pensando sempre em compartilhar tudo que tenho aprendido, resolvi escrever sobre o seu gerenciamento de memória.
Introdução
O JavaScript aloca memória automaticamente quando cria: objetos, strings, functions … etc, e libera quando esses dados não são mais utilizados, esse processo é chamado de Garbage Collection (GC).
Esse processo ocorre em todas as linguagens de alto nível, diferente das de baixo nível como o C que tem os métodos malloc()
e free()
para fazer esse gerenciamento.
Esse processo pode facilmente gerar uma confusão e dá a impressão aos desenvolvedores JavaScript (e de outras linguagens de auto nível) que não precisam se preocupar com o consumo de memória. Isso é um grande erro na minha opinião.
Mesmo trabalhando com linguagens de alto nível, devemos sempre nos preocupar com o gerenciamento de memória, pois existem muitos perfis de usuários. Pensando nisso, criei alguns tópicos abaixo para que você possa conhecer um pouco a mais desse processo.
Ciclo de vida da memória
Analisando um fluxo básico de gerenciamento de memória nos temos:
- Alocação de memória
- Utilização (ler, escrever)
- Liberação de memória alocada quando não é mais necessária
Pensando em linguagens de alto nível como: JavaScript, C# … etc o terceiro passo e gerenciado pelo GC.
Agora para que você possa ter um melhor entendimento, veja abaixo cada um desses passos, focando na linguagem JavaScript.
Alocação de memória
Nosso primeiro passo será entender como funciona alocação de memória.
var n = 2479000; // aloca memória para um número
var s = "kratos"; // aloca memória para uma string
// aloca memória para um objeto e seus valores
var obj = {
a: 13,
b: null
};
// (assim como o objeto) aloca memória para o vetor e
// seus valores contidos
var a = [1, null, "abra"];
// aloca uma função (que é um objeto que pode ser chamado)
function f(a){
return a + 2;
}
Alocação via chamada de função
Algumas funções quando chamadas resultam na alocação de um objeto.
var d = new Date();
// aloca um elemento do DOM
var date = document.createElement('div');
Alguns métodos alocam novos valores ou objetos:
var s = "kratos";
var s13 = s.substr(0, 3); // s13 é uma nova string
Utilização de valores
A utilização de valores basicamente significa leitura e escrita em memória alocada. Isto pode ser feito:
- ao ler ou escrever o valor de uma variável
- no acesso de uma propriedade de um objeto
- ao passar um argumento para uma função
Memory leak
Para finalizar esse artigo achei legal passar um pouco sobre memory leak. Caso você ainda não tenha ouvido nada sobre esse assunto, “memory leak” ou traduzindo para o português “vazamentos de memória” é um problema que a grande maioria de nós desenvolvedores já passou. Esse problema ocorre quando uma porção de memória alocada para uma determinada operação, não é liberada quando não é mais necessária. Caso tenha interesse em saber mais sobre esse assunto, segue link de um artigo bem completo sobre esse assunto Beyond Memory Leaks in JavaScript criado por @daniel.reis.
Bom, espero que tenham gostado é até um próximo artigo 😉