Java Garbage Collector - Introdução (parte 1)

O objetivo deste artigo é conhecermos como a JVM lida com o gerenciamento de memória de nossas aplicações, quais os tipos de Garbage Collectors existentes até o momento e como escolher o melhor para determinada situação.

O Garbage Collector (GC) é uma forma de realizar o gerenciamento automático de memória. Podemos dizer que é um processo capaz de localizar objetos usados ou não na memória heap, remover os não utilizados e compacta-los após o liberamento de espaço. Muitas implementações de um Garbage Collector, possuem as seguintes operações básicas:

  • Alocação de memória do objeto.
  • Buscar objetos em uso (Mark)
  • Liberar objetos que não estão em uso (Sweep)
  • Prevenção de fragmentação (Compact)

Em Java os objetos são criados quando necessário e quando não estão mais em uso, a JVM através do GC os remove automaticamente e libera a memória— bem diferente de C ou C++ (exceto se utilizado reference counting) onde você precisa gerenciar esse processo programaticamente.


Gerenciamento de memória

Não há como, falarmos sobre GC sem antes conhecer um pouco da arquitetura de gerenciamento de memória da JVM e o que o Garbage Collector tem a ver com isso. A imagem abaixo ilustra bem essa arquitetura com o antes e depois do Java 8, no caso, nesse artigo daremos foco apenas para versões do Java 8+

Imagem do livro: Hands-On High Performance with Spring 5

O Garbage Collector do Java trabalha em cima da memória heap, no qual é dividida logicamente em dois grandes espaços para algumas das principais implementações de GC:  

A Young Generation composta por dois blocos, o Eden e Survivor (S0 e S1) e a Old Generation (Também chamada de Tenured).

Imagem do livro: Hands-On High Performance with Spring 5

Young Generation

Dividida entre Eden e Survivor, o Eden é o local onde novos objetos são alocados ao serem construídos (new). Quando o espaço Eden for preenchido, um evento do GC (ex: Minor GC) poderá ser acionado para um ciclo de coleta, objetos que não são mais utilizados serão removidos e os que ainda estão em uso, movidos para o Survivor ou para a Old Gen, dependendo de seu ciclo de coleta (tenuring threshold — default 15).

Old Generation

A Old Generation é onde os objetos sobreviventes aos ciclos de coleta da Young Gen serão armazenados. Um evento do GC, como o Full GC será acionado quando o espaço se encher ou um Concurrent GC (se aplicável) será agendado quando o heap começar a se encher.


Fragmentação

Para finalizar a sessão de gerenciamento de memória, o GC também fica responsável por lidar com o problema de fragmentação que normalmente ocorre após a operação de Mark and Sweep.

Adesfragmentação dos espaços vazios ocorre na operação de compactação (Compact) que pode ser executada após as operações Mark and Sweep ou em algumas implementações de GC, pode ser feita uma passagem separada, assim, a eficiência do espaço de memória para alocação pode ser aumentada.

Compactação de memória | Fonte: Plumbr — Java Garbage Collection Handbook

No próximo post falaremos das principais implementações veja a parte 2: AQUI

Help DEV – Analista desenvolvedor Java / Android https://helpdev.com.br/zarelli

Java Garbage Collector - Introdução (parte 1)

2 pensou em “Java Garbage Collector - Introdução (parte 1)

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Rolar para o topo