Capítulo 5
Garbage Collector





Introdução
Funcionamento do
Garbage Collector
Execução do
Garbage Collector
O método finalize()
Preparando o objeto
para a coleta




Obtendo dados
sobre memória
Configurações de
memória
Ciclo de vida dos
objetos
Tipos de referência
2
Introdução

Exploraremos aqui alguns aspectos da
linguagem de programação Java quanto
à utilização da memória do computador.
3
Introdução

Durante o seu ciclo de vida, uma
aplicação Java consome recursos de
memória conforme sua necessidade
alocando espaços para reter as
informações utilizadas durante o
processamento.
4
Introdução
c
p
o
s
Cliente c = new Cliente();
Produto p = new Produto();
String s = “Impacta”;
Object o = p;
c = new Cliente();
p = new Produto();
s = null;
5
Introdução


Após a execução de
instruções, a memória
do computador pode
reter informações
desnecessárias e não
mais utilizadas pela
aplicação
Estas informações são
consideradas lixo de
memória.
c
p
o
s
6
Introdução

Em linguagens de programação como C e C++,
tais alocações devem ser explicitamente
removidas pela aplicação a fim de liberar estes
espaços de memória.

A não-liberação destes recursos de memória pode
acarretar a perda de performance da aplicação e
impedir que outras informações mais importantes
sejam carregadas, causando falhas como “out of
memory”, “stack overflow” e, em alguns casos,
reter lixo em memória mesmo após o
encerramento da aplicação.
7
Garbage Collector

O Garbage Collector é um recurso da
linguagem Java responsável pela
limpeza automática das informações
não mais utilizadas pela aplicação.

O Garbage Collector retira do
programador Java a responsabilidade
de desalocar os recursos de memória
utilizados pela aplicação.
8
Execução do Garbage Collector

O Garbage Collector é automaticamente
executado de tempos em tempos pelo JVM.

Todavia, podemos programaticamente solicitar ao
JVM a execução do Garbage Collector através da
instrução abaixo:
System.gc();

Vale observar que o uso da instrução System.gc()
não garante que o JVM realize a execução
imediata do Garbage Collector, por questões de
disponibilidade de processamento.
9
O método finalize()

Ao coletar cada um dos objetos
considerados lixo de memória, o
Garbage Collector executa para cada
um deles o método finalize()

O finalize() – também chamado de
método destrutor – é um método
presente na classe Object e, portanto,
herdado por toda e qualquer classe
presente na linguagem.
10
O método finalize()

O método finalize() possui a
funcionalidade inversa ao método
construtor.

É executado pelo GC quando o objeto é
elimidado da memória.
11
O método finalize()

Ao criar uma classe, podemos sobrescrever o
método finalize() adicionando instruções de
encerramento e finalização.
public class Cliente {
...
...
protected void finalize() {
...
gravarDados();
enviarEmail();
...
}
}
12
Preparando o objeto para coleta

Um objeto é considerado um candidato para
coleta – ou coletável – quando não possui mais
nenhuma referência na aplicação apontando para
ele.

Existem tipicamente três situações em que o
objeto é preparado para coleta tornando-se
coletável.
 Exclusão de referência
 Alteração de referência
 Isolamento de referência
13
Preparando o objeto para coleta

Exclusão de referência
 Ocorre quando a variável que aponta para
aquele objeto perde o seu escopo ou é
anulada
c = new Object();
....
....
c = null;
c
14
Preparando o objeto para coleta

Alteração de referência
 Ocorre quando a variável que apontava
para um objeto passa a apontar para um
outro objeto.
c = new Object();
....
....
c = new Object();
c
15
Preparando o objeto para coleta

Isolamento de referência
 O Garbage Collector consegue identificar
também referências circulares em sua
aplicação, removendo-as caso seja necessário
x = new Funcionario();
y = new Funcionario();
x.setEncarregado(y);
y.setEncarregado(x);
y = null;
x = null;
x
y
16
Obtendo dados sobre a memória

Durante a execução de uma aplicação,
podemos obter informações de memória
através da classe java.lang.Runtime
Runtime runtime = Runtime.getRuntime();
long free = runtime.freeMemory();
long total = runtime.totalMemory();
long max = runtime.maxMemory();
System.out.printf("Memória livre : %,12d%n", free);
System.out.printf("Memória total : %,12d%n", total);
System.out.printf("Memória limite: %,12d%n", max);
17
Configurações de memória

Ao executar uma aplicação Java,
podemos definir a quantidade de
memória que o sistema operacional
disponibilizará para o JVM:
java -Xms128m -Xmx512m OlaMundo
18
Configurações de memória

-Xms
 Define a quantidade inicial de memória a ser
utilizada pelo JVM.

-Xmx
 Define a quantidade máxima de memória
que o sistema operacional alocará para o
JVM.
19
Ciclo de vida dos objetos
Created
In use
Invisible
Unreachable
Collected
Finalized
Deallocated
20
Ciclo de vida dos objetos
Created
In use
Unreachable
Collected
Finalized
Invisible

Created
O ciclo de vida do objeto começa com
o estado “Created”, quando o JVM já
alocou espaço em memória para
registrar todos os membros de dados
do objeto, mas ainda não o inicializou.
Deallocated
21
Ciclo de vida dos objetos
Created
In use
Unreachable
Collected
Finalized
Deallocated
Invisible

In use
Após a criação, o JVM realiza a
inicialização do objeto, executando os
passos na seguinte ordem
1.
2.
3.
4.
Incializa os membros da classe mãe;
Executa o construtor da classe mãe;
Inicializa os membros da própria classe;
Executa o construtor da própria classe.
22
Ciclo de vida dos objetos
Created
In use
Unreachable
Collected
Finalized
Deallocated
Invisible

Invisible
Ao longo da aplicação, o objeto podese tornar invisível.
Isto ocorre quando a(s) sua(s)
referência(s) está(ão) fora do escopo
atual, onde não podemos manipular
aquele objeto diretamente.
23
Ciclo de vida dos objetos
Created
In use
Unreachable
Collected
Finalized
Invisible

Unreachable
Um objeto torna-se unreachable
(inalcançável) quando não há mais
nenhuma referência (variável)
apontando para ele, tornando-se
candidato a ser coletado.
Deallocated
24
Ciclo de vida dos objetos
Created
In use
Unreachable
Collected
Finalized
Invisible

Collected
O objeto coletado é aquele que já foi
identificado pelo GC para coleta mas
ainda não teve a oportunidade de
iniciar o processo de finalização deste.
Deallocated
25
Ciclo de vida dos objetos
Created
In use
Unreachable
Collected
Finalized
Invisible

Finalized
O objeto é considerado finalizado
quando o GC já executou o seu
método finalize(), mas ainda não
desalocou o espaço de memória
ocupado por este.
Deallocated
26
Ciclo de vida dos objetos
Created
In use
Unreachable
Collected
Finalized
Deallocated
Invisible

Deallocated
Última etapa do ciclo de vida do objeto.
Ao ser desalocado, o espaço de
memória que antes era ocupado pelo
objeto torna-se totalmente liberado
como se o objeto nunca tivesse existido.
27
Tipos de referência

Existem diferentes tipos de referências
à objetos que podem ser utilizados pela
aplicação:
 Referência strong
 Referência soft
 Referência weak
 Referência phantom
28
Tipos de referência

Referência strong
 Referência strong
 Referência soft
 Referência weak
 Referência phantom
29
Tipos de referência

Até o momento temos utilizado variáveis
comuns para referenciar objetos em
memória.

Tais variáveis são chamadas “strong”.

Uma variável strong é uma variável cujo
objeto apontado nunca é coletado pelo
GC.
30
Download

Garbage Collector