Como o Javascript e outras linguagens de alto nível lidam com o gerenciamento de memória
Published: 2023-02-15 22:33:32

## Introdução :computer:
No dia a dia trabalhando com linguagens de alto nível como Javascript ou Python normalmente alguns pontos acabam passando despercebidos por nós, por conta dos diversos tipos de abstrações presentes nas linguagens mais modernas. Nesse post comentarei um pouco sobre como algumas das principais linguagens lidam com gerenciamento de memória e quais algoritmos são usados para tornar esse processo mais fácil.

## Exemplos :page_facing_up:

Um programa é basicamente constituído pelo uso de memória, nós escrevemos dados na memória e lemos dados da memória. Em linguagens como C e C++, por exemplo, podemos executar de forma explícita dois tipos diferentes de alocação de memória.

* Estático: Declaramos uma variável com um valor fixo e o compilador irá alocar o espaço necessário para esse dado na memória (Stack) e nos retornar uma referência a esse valor em tempo de compilação.

![Static memory allocation using C programming language](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eohygnc58iofrf2n678b.png)

* Dinâmico: Nós manualmente alocamos a quantidade de espaço que iremos precisar em memoria (Heap) conforme o tipo de dado que vamos guardar, no tempo de execução do código. Agora temos um ponteiro para esse valor e podemos manipulá-lo da forma que quisermos, alocando mais memória se precisarmos ou liberando essa memória caso não formos mais usar.


![Dynamic memory allocation using C programming language](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zj4z47k8po72vah8v6xg.png)

Olhando os exemplos citados acima você pode parar pra perceber que não existe algo como o segundo exemplo em códigos Javascript por exemplo, isso se deve ao fato de que a alocação de memória dinâmica é feita de forma automática pela Engine da linguagem.

Quando você declara um objeto em Javascript por exemplo, a Engine vai alocar a memória conforme a necessidade no tempo de execução do programa, você não precisa se preocupar em adicionar mais espaço manualmente.


![Object declaration using Javascript programming language](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/68f81wef8vbcoiav7fu6.png)

Mas se a memória é alocada automaticamente, como ela é liberada? No código C por exemplo nós chamamos a função "free" para indicar que aquele espaço poderia ser liberado porque não iriamos precisar mais, mas como essas linguagens fazem isso?

O Garbage Collector é responsável por realizar essa análise de quando a memória não é mais necessária. Resumindo absurdamente, a Engine realiza esse processo com base nas referências aos valores que ainda existem no programa, de uma olhada no código abaixo:


![Object declaration and references example using Javascript programming language](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s6t07qn4b0x8on7fx9kz.png)

## Considerações Finais :100:

Gerenciamento de memória feito de maneira manual, como em C e C++ pode se tornar extremamente complexo, dependendo do escopo de um programa. O uso desse tipo de solução pelas linguagens,  torna esse processo mais fácil para os Desenvolvedores e ajuda a evitar muitos bugs que poderiam ser acarretados por um gerenciamento mal feito.

Porém, como tudo em tecnologia há também alguns pontos para se atentar. Os algoritmos e soluções de Garbage Collection adotados por diversas linguagens, possuem alguns problemas que podem realmente prejudicar Softwares mais complexos:

* A demora para liberação de memória.
* Os processos usam muita memória.
* Elevados níveis de uso de CPU.

Por alguns desses motivos, em alguns Softwares complexos e grandes como Sistemas Operacionais e outras aplicações que necessitam de um gerenciamento de memória mais preciso, é possível ainda se ver o uso de linguagens como C, C++ e Rust (Grande adoção nos últimos anos), para que seja possível manter um maior controle do que está acontecendo na memória.

Gerenciamento de memória é um tópico extremamente complexo e sem dúvidas nenhuma esse artigo é apenas uma pequena introdução de um iniciante no assunto para como linguagens modernas se propõem a solucionar esse problema. 

Espero que tenha sido útil e também listei abaixo algumas referências que utilizei e recomendo fortemente para quem quiser dar uma aprofundada no assunto. Caso tenham dicas e informações a acrescentar sobre eu estou fortemente interessado em aprender mais!

Muito obrigado! :smile:

## Referências

Documentação da MDN - "Memory Management" [Link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management#garbage_collection)

Artigo Felix Gerschau - "Javascript Memory Management Explained
[Link] (https://felixgerschau.com/javascript-memory-management/)

Documentacao da Microsoft - "Garbage collection and performance" [Link] (https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/performance)