Garbage Collector: Como Funciona?
Garbage Collector é um termo comum na programação moderna.
Muitos desenvolvedores, tanto iniciantes como experientes “vivem” com ele diariamente sem ao menos saber disso.
E hoje eu quero compartilhar com você o que é e como o Garbage Collector afetar a sua vida de desenvolvedor. Seja uma aplicação Web, Mobile ou Desk.
Quando você entende os princípios da computação, seu poder de criação é levado à outro nível!
Funções do Garbage Collector
O próprio nome já dá um spoiler do que é o Garbage Collector.
Ele é um coletor de “sujeira” do seu sistema. Ou seja, sua principal função é descartar os espaços de memória alocados que não são mais usados pela aplicação.
Nos primórdios da computação e em linguagens mais antigas como o C, esse processo é feito manualmente pelo desenvolvedor. O que de fato, te dá mais controle ainda do seu sistema.
Porém, como diz o Tio Ben do Peter Parker, com grandes poderes, vem grandes responsabilidades.
Logo, é de responsabilidades dos desenvolvedores gerenciar as memórias nessas linguagens que não fornecem o Garbage Collector.
Vantagens do Garbage Collector
As linguagens de programação que já fornece um Garbage Collector como por exmeplo o Java, fornecem junto:
- produtividade ao desenvolvedor
- melhor trabalho em equipe
- ganho na redução de bugs
Mesmo o Garbage Collector fazendo tudo isso por você e o sistema, é preciso que o profissional saiba manipular os objetos para o Garbage Collector agir na hora certa, principalmente em games Mobile ou sistemas embarcados que demandam um gerenciamento crítico dos objetos.
Se você já desenvolveu uma aplicação Java, talvez você já tenha se deparado com o famoso OutOfMemoryError ou Java Heap no space.
Como funciona o gerenciamento de memória com Garbage Collector
Primeiramente você precisa entender que tudo na computação são bits armazenados em registrados / memórias. Esses bits são alocados e ocupados e em um momento futuro, você precisa desse espaço livre novamente para novos bits.
Essa memória é tratada de 2 partes:
- Pilha
- Heap
A pilha geralmente é onde se aloca variáveis locais já o Heap é onde alocamos variáveis dinâmicas ou objetos de fato.
1
2
3
4
5
void send() {
// ...
int x = 0;
User user = new User();
}
Neste exemplo, como a variável user aponta para um objeto, o new User
efetivamente vai para o Heap. Enquanto a variável user
é alocado na pilha. Já o int x
fica armazenado na pilha, sendo uma variável local.
Em curtas palavras, sempre que há um new
(instancia) de um objeto, o heap cresce com objetos.
Isto significa que se você criar um ArrayList com 10mil objetos, você estará inflando o seu Heap.
Ok. Mas qual o momento que o Garbage Collector entra em ação?
O Garbage Collector não tem uma hora exata para entrar em ação. Mas ele começa o seu processo de “análise” para saber quem deve ser limpado no momento em que um objeto não possui mais nenhuma referência para ele.
No nosso exemplo, quando a variável user
estiver com null
e o objeto real User()
não tiver mais nenhuma outra variável apontando para ele, esse objeto se torna um forte candidado a ir para o coletor de sujeira.
O algoritmo responsável por esse processo seja chama Mark and Sweep - Marcar e varrer.
(Assista o video acima onde é explicado como o algoritmo funciona).
É possível chamar o Garbage Collector manualmente?
Essa é uma pergunta curiosa e polêmica.
Muitos desenvolvedores usam um hack para forçar a execução do Garbage Collector. O que, em muitos casos, não é uma boa ideia pois ele demora para executar e se, você precisa de performance, isso não é bom.
Existem outras estratégias melhores como pools e outras mais.
Mas supondo que você realmente queira livrar espaços e tentar forçar o coletor a agir, você pode atribuir null
a referência para que o algoritmo entre em ação OU usar a instrução System.gc()
OU a melhor opção seria usar referencias weak do pacote java.lang.ref
como as classes:
- WeakReferences
- StrongReferences
- PhantomReferences
- etc
Espero que tenha esclarecido um pouco mais a importância do conhecimento de baixo nível da programação e como funciona o Garbage Collector de modo geral.
Um grande abraço!
Tiago Aguiar
Maravilha! Em breve você receberá conteúdos exclusivos por e-mail. Continue lendo os artigos para aprender mais sobre programação.