Sei sulla pagina 1di 4

Funcionamento do coletor de lixo

gleydson@jspbrasil.com.br
Em Java, diferente de outras linguagens como C e C++, o programador no precisa desalocar
memria, usando funes como free e delete. Java possui um coletor de lixo, um thread de baixa
prioridade que roda junto com a Java Virtual Machine e procura por reas de memria que no
estejam mais em uso para realizar a liberao da mesma.
A execuo do coletor de lixo transparente para o programador, porm, podemos em algumas
situaes querer usar alguns artifcios para otimizar o uso da memria usada pela JVM. O coletor de
lixo deixa o programador livre da tarefa de gerenciamento de memria, porm isso no significa que
o programador no deve se preocupar com o uso da memria em suas aplicaes.

O coletor de lixo libera a memria mantida por um objeto se no houver mais nenhuma referncia
para ele. Dependendo do algoritmo da coleta de lixo usado pela mquina virtual Java no qual o
cdigo est sendo executado, nem todo objeto desreferenciado ser desalocado pelo coletor de lixo.
Um objeto mais antigo, de longa durao, menos provvel de ser desreferenciado do que um
objeto novo, de modo que um algoritmo comum para coleta de lixo analisar os objetos mais
antigos com menos freqncia do que os objetos mais novos.

Podemos ter um mtrica da eficincia da implementao do coletor de lixo utilizado pela sua JVM
com o cdigo abaixo:

Runtime rt = Runtime.getRuntime();
long mem = rt.freeMemory();
System.out.printn(Memria Livre: + mem);

// ... algum cdigo

System.gc();
// ...
mem = rt.freeMemory();
System.out.println(Memria Livre: + mem);

O cdigo acima obtm o ambiente de execuo com o mtodo esttico getRuntime() da classe
Runtime. O mtodo freeMemory() retorna a memria disponvel no ambiente runtime. A linha
System.gc() faz a chamada explcita do coletor de lixo.

A grande maioria das implementaes da JVM resulta na execuo do coletor de lixo como resultado
da chamada do mtodo System.gc(). Alm disso, a maior parte das mquinas virtuais fazem a
chamada do coletor implicitamente quando a memria est baixa ou quando a CPU est inativa por
um certo perodo de tempo.

Problemas de memria podem surgir quando os objetos contm variveis de instncia que so
iniciadas no construtor, ocupam um grande quantidade de memria e no so mais utililzadas no
restante da aplicao. Isso pode degradar o desempenho do seu cdigo.

Desreferenciado variveis atribuindo-as null


Uma maneira de tornar o contedo da varivel um candidato a ser limpo pelo coletor de lixo,
atribuindo null a varivel. Com isso, o dado torna-se desreferenciado e pode ser limpo pelo coletor
de lixo. O programa abaixo ilustra isso:

import java.util.*;

class GarbageExample {
private static Vector vetor;
public static void main(String args[]) {
vetor = new Vector();
for (int a=0; a < 500; a++)
vetor.addElement(new
StringBuffer("teste"));
Runtime rt = Runtime.getRuntime();
System.out.println("Memria Livre: " +
rt.freeMemory());
vetor = null;
System.gc();
System.out.println("Memria Livre: " +
rt.freeMemory());
}
}

O cdigo acima aloca 500 objetos StringBuffer e os coloca dentro de um Vector. O objeto da classe
Vector referenciado pela varivel vetor. Quando atribui-se o valor null para a varivel vetor o
contedo do objeto Vector (500 StringBufferes) no possui mais referncia na aplicao. A chamada
do coletor de lixo faz a limpeza desse objeto e imprime a memria antes e depois da limpeza.

Essas tcnicas podem solucionar o problema de manter grandes quantidades de memria


desnecessrias. Para usar o mnimo de memria possvel, os objetos que existem pela durao do
programa devem devem ser os menores possveis. Alm disso, grandes objetos devero existir pelo
menor tempo possvel.

A limitao da quantidade de memria utilizada por um programa em Java pode ajudar no

desempenho apenas do cdigo em Java rodando na mesma instncia da JVM, e no necessariamente


de outros programas rodando no mesmo sistema. Isso porque muitos algoritmos de gerenciamento
de heap alocam antecipadamente uma parte da memria para ser usada pelo seu cdigo. Ou seja,
voc libera a memria da mquina virtual Java, o que no afetar outras aplicaes no-Java, pelo
fato da JVM pre-alocar o heap que ela precisa.

A qualquer momento voc poder solicitar a execuo do coletor de lixo, chamando o mtodo
System.gc(). Porm, necessrio analisar o impacto de desempenho na sua aplicao. Muitos
algoritmos de coleta de lixo suspendem todos os outros threads antes de entrar em execuo. Isso
garante que, quando o coletor de lixo for executado, ele ter acesso completo memria no heap e
poder realizar suas tarefas com segurana, sem que seja interrompido por outro thread. Quando o
coletor de lixo termina seu trabalho, todos os threads que ele suspendeu so retomados.

O coletor de lixo de Java executado com um grande freqncia, sua chamada explcita dificilmente
necessria. Porm, em alguns casos pode tornar-se conveniente. Procure evitar a chamada do
mtodo System.gc() e nunca o use dentro de loops.

O mtodo finalize()
O programador pode definir o mtodo finalize que ser chamado sempre antes do objeto ser coletado
pelo coletor de lixo. A aplicao abaixo ilustra isso:

import java.util.*;
class GarbageExample {
private static MeuVetor vetor;

class MeuVetor extends Vector {


public void finalize() {
System.out.println("Vou ser coletado!!");
}
}

O mtodo finalize da classe MeuVetor executado antes do objeto ser coletado da memria, a sada
deste programa :

Memria Livre: 459808


Vou ser coletado!!
Memria Livre: 600664

Neste artigo procurei dar uma idia da coleta de lixo e dicas para otimizar o uso da memria em suas
aplicaes Java. A chamada do System.gc() deve ser evitada, porm h situaes em que ela pode
ser usada.

Potrebbero piacerti anche