image

Acesse bootcamps ilimitados e +650 cursos pra sempre

60
%OFF
Ruth Santos
Ruth Santos22/08/2025 17:16
Compartilhe

O gerenciamento de memória no desenvolvimento Java e o funcionamento do Garbage Collector

  • #Java

Lembro de quando era criança e para fugir do tédio, em meados de 2014, alguns dispositivos móveis tinham joguinhos instalados, quando abertos a primeira coisa que se dava de cara é aquela logo de uma xícara e o nome “Java”.No momento em que decidimos adentrar no mundo da programação, ter noções de algoritmos e a existência das linguagens de programação, vem á tona a lembrança daquela logo que vimos bem anos atrás e o desenvolvimento do pensamento curioso e analítico quando começamos desenvolver os primeiros algoritmos em alguma linguagem de programação, queremos saber o que acontece na execução desses algoritmos, através de uma IDE , em especial na memória do nosso desktop.  

Como programadores iniciantes, o estudo se torna desafiador ao compreender “para onde vai os dados na memória?”,” de onde vêm este erro?” , “será que o meu algoritmo apresenta performance ao usuário final ou cliente?”. Uma boa compreensão dos conceitos de memória em programação, o que é garbage collector , em especial utilizando Java como linguagem e a utilização dos pilares da programação orientada a objetos contribui para o aprendizado efetivo e o amplia para um conhecimento multilinguagens. 

 No desenvolvimento de um algoritmo, fazemos a declaração das famosas variáveis que tem como conceito: ¹ uma representação simbólica na memória do computador que armazena um tipo de dado que pode variar ao decorrer da execução de um sistema. Esses algoritmos são executados na Random Acess Mémory, a memória RAM, traduzindo em português como “memória de acesso aleatório”, ²que é uma memória de curto prazo do computador, onde são armazenados os dados que o processador está utilizando naquele momento ao decorrer da execução de um algoritmo ou programa.

Declarando as variáveis em Java, do tipo valor, podemos ver a aplicação dos conceitos de alocação estática e dinâmica de memória, no momento de sua criação.

Ao declararmos o tipo de dado da variável e como ela será identificada, sendo criada após sua atribuição, que pode ser um valor atribuído diretamente ou definido pelos mecanismos de entrada pelo usuário.

Ao entrar em execução, os dados dessa variável são armazenados “em caixa”, na memória STACK, que significa “pilha, que é um endereço da memória RAM, fazendo alusão a um “empilhamento de caixas”, vemos a aplicação do conceito de alocação estática de memória.

³A memória STACK, cria um ENDEREÇO DE MEMÓRIA que identifica essa “caixa” onde o dado está armazenado, sendo identificado como HASH. 

Exemplificando, se declaramos e criamos a variável da seguinte maneira:

public class StackExample {

public static void main(String[] args) {

// Variável do tipo primitivo (tipo valor)

int number = 42;

// Exibe o valor da variável

System.out.println("Valor armazenado: " + number)

}

  }

O que acontece pode ser visivelmente representado desta forma:  

image

Fonte: ChatGpt; prompt: “reproduza em ilustração como uma variável do tipo valor é alocada na memória estática stack com endereço de memória”, endereço" hash" localizado abaixo da caixa. 

Em linguagens de programação que sejam orientada a objetos, a aplicação desses conceitos pode mudar um pouco a forma como o código é desenvolvido. A aplicação de POO, em Java, reproduzem ações como: a criação de classes, a criação e a definição do nível de acesso de seus atributos e a instanciação de um objeto. Em um algoritmo desenvolvido em Java, aplicando as práticas de POO, vemos a aplicação do conceito de alocação dinâmica de memória.

As variáveis declaradas e criadas em um código orientado a objetos, em sua maioria do tipo classe, recebem a definição de variáveis do tipo referência.

Elas são armazenadas em uma área da memória de nome HEAP, que significa a “junção de pilhas, caixas compostas”, pois apontam, ou seja, fazem referência para as caixas que possuem dados, onde esses dados serão objetos, na memória stack.

Exemplificando utilizando um código em Java orientado a objetos:

 class Person {

String name;

int age;

// Construtor

Person(String name, int age) {

this.name = name;

this.age = age;

}

// Método para exibir informações

void showInfo() {

System.out.println("Nome: " + name + ", Idade: " + age);

}

Código de funcionamento do sistema com método "main":

 public class ReferenceExample {

public static void main(String[] args) {

// Variável de referência (armazenada na Stack)

Person personRef;


// Criação do objeto (armazenado na Heap)

personRef = new Person("João", 25);


// A variável personRef guarda o endereço do objeto na Heap

System.out.println("Referência (endereço na Heap): " + personRef);

// Usando a referência para acessar dados do objeto

personRef.showInfo();

}  
 }

Segue abaixo uma representação visual do que acontece na memória:

image

 Fonte: ChatGpt; prompt: "reproduza em ilustração como uma variável do tipo referência é armazenada na memória stack e referenciada na memória heap". 

Se torna uma preocupação do desenvolvedor e também um requisito importantíssimo da engenharia de software, no quesito "performance engineer", a otimização de recursos e a avaliação dessas métricas de consumo de heap, stack… Existe um conceito fundamental e multilinguagens de automatização de gerenciamento de memória de um programa em execução, que pouco se é falado em métricas de estudo da programação, processamento e utilização de memória, chamado GARBAGE COLLECTOR:

O Garbage Collector, é um “faxineiro automático de memória”, um mecanismo multilinguagens que gerencia a memória de forma automática.

Na execução de um programa, ele aloca a memória para armazenar não só variáveis, mas objetos e estruturas de tipos de dados, e funciona em três etapas principais, funcionando simultaneamente da seguinte forma: 

Marcação(mark): um coletor percorre os objetos e identifica quais ainda estão sendo usados (referenciados pelo programa; heap);

Varredura(sweep): libera os objetos que não foram marcados, pois não há mais referências a eles.

Compactação: em alguns modelos de GC, após a liberação, os objetos restantes são “reorganizados” na memória para evitar fragmentação.

Em Java, o Garbage Collector é parte da JVM (Java virtual machine), e se comporta de forma mais robusta do que em outras linguagens, pois especialmente desempenha o papel de cuidar automaticamente da coleta de objetos que não têm mais referências, garantindo que os objetos não usados sejam descartados de forma segura, deixando o desenvolvedor focar mais na lógica e menos em detalhes de alocação e liberação.

O conceito do Garbage Collector pouco se é falado nos paradigmas e métricas do estudo do desenvolvimento de software. Mesmo sendo iniciante ou não, se trata de um conceito de grandiosa relevância ao aprendizado do iniciante gerando uma maior percepção da lógica aplicada ao algoritmo e observância do funcionamento do código. Realizando o processo de depuração na criação de algoritmos, também é possível analisarmos o desempenho e a robustez desse sistema, dando espaço para um aprendizado eficiente e desenvolvendo um código portátil e seguro.

Para conclusão deste artigo e aprofundamento sobre estes conceitos, sugiro as seguintes fontes abaixo:

Livro: “Use a cabeça, Java” – escritora Alta Book’s dos autores Kathy Sierra, Bert Bates e Trisha Gee, que aborda o funcionamento do garbage collector em objetos que não possuem referência no desenvolvimento Java.

Endereço Web: Java Garbage Collection Basics - Documentação oficial do Java, no site da Oracle, que faz uma introdução didática ao Garbage Collector na JVM.

Referências bibliográficas:

1 -Conceito de variáveis: https://embarcados.com.br/variaveis-e-constantes/

2- Memória RAM: https://www.avast.com/pt-br/c-what-is-ram-memory#:~:text=A%20RAM%20(mem%C3%B3ria%20de%20acesso,processador%20est%C3%A1%20usando%20no%20momento.

3 / 4- Memória Stack/ Heap: https://www.dio.me/articles/heap-stack-atribuicao-por-referencia-e-por-valor-o-que-e-cada-uma

5- Conceito de Garbage Collector:

ORACLE. Java Garbage Collection Basics. Disponível em: https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html.

ORACLE. Java SE 11 Garbage Collection Tuning Guide. Disponível em: https://docs.oracle.com/en/java/javase/11/gctuning/introduction-garbage-collection-tuning.html.

6- Coleta de lixo e conceitos de multilinguagens:

PYTHON SOFTWARE FOUNDATION. Garbage Collection interface. Documentação oficial. Disponível em: https://docs.python.org/3/library/gc.html.

JONES, R.; HOSKING, A.; MOSS, E. The Garbage Collection Handbook: The Art of Automatic Memory Management. CRC Press, 2011.

NEW RELIC. Java Garbage Collection: How it works and best practices. Disponível em: https://newrelic.com/blog/best-practices/java-garbage-collection.

WIKIPEDIA. Garbage collection (computer science). Disponível em: https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)..

Compartilhe
Recomendados para você
Riachuelo - Primeiros Passos com Java
GFT Start #7 - Java
NTT DATA - Java e IA para Iniciantes
Comentários (0)