Capítulo 5. Garbage Collector Introdução Funcionamento do Garbage Collector Execução do...

30
Garbage Collector Capítulo 5

Transcript of Capítulo 5. Garbage Collector Introdução Funcionamento do Garbage Collector Execução do...

Garbage CollectorCapí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

Cliente c = new Cliente();

Produto p = new Produto();

String s = “Impacta”;

Object o = p;

c = new Cliente();

p = new Produto();

s = null;

5

c p so

Introdução

6

c p so 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.

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;

14

c

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();

15

c

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;

16

x y

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.

-XmxDefine a quantidade máxima de memória

que o sistema operacional alocará para o JVM.

19

Ciclo de vida dos objetos

20

Created

In use Invisible

Unreachable

Collected

Finalized

Deallocated

Ciclo de vida dos objetos

CreatedO 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.

21

Created

In use Invisible

Unreachable

Collected

Finalized

Deallocated

Ciclo de vida dos objetos

In useApós a criação, o JVM realiza a inicialização do objeto, executando os passos na seguinte ordem

1. Incializa os membros da classe mãe;2. Executa o construtor da classe mãe;3. Inicializa os membros da própria classe;4. Executa o construtor da própria classe.

22

Created

In use Invisible

Unreachable

Collected

Finalized

Deallocated

Ciclo de vida dos objetos

InvisibleAo longo da aplicação, o objeto pode-se 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

Created

In use Invisible

Unreachable

Collected

Finalized

Deallocated

Ciclo de vida dos objetos

UnreachableUm 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.

24

Created

In use Invisible

Unreachable

Collected

Finalized

Deallocated

Ciclo de vida dos objetos

CollectedO 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.

25

Created

In use Invisible

Unreachable

Collected

Finalized

Deallocated

Ciclo de vida dos objetos

FinalizedO 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.

26

Created

In use Invisible

Unreachable

Collected

Finalized

Deallocated

Ciclo de vida dos objetos

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

Created

In use Invisible

Unreachable

Collected

Finalized

Deallocated

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 strongReferê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