Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

33
Gerenciamento de Memória pela Máquina Virtual Java Prof Adriano Teixeira de Souza Fasul – Faculdade Sul Brasil

Transcript of Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Page 1: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Gerenciamento de Memória pela Máquina Virtual Java

Prof Adriano Teixeira de Souza

Fasul – Faculdade Sul Brasil

Page 2: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Gerenciamento de Memória

• Alocação de recursos (RAM, cache, virtual, swap, buffer)

• Reciclagem• Fragmentação• Recolocação• Compactação• Gerenciamento automático

Page 3: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Gerenciamento de Memória

Alocação de Recursos• Objetos, estruturas de dados• Blocos de memória• De onde buscar ?RAM fisica, cache, buffer, swap, shared

• Depende da desalocação eficiente

Page 4: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Gerenciamento de Memória

Reciclagem• Colocar um bloco usado como livre• Apontar para null• Depende do tipo de gerenciador

Page 5: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Gerenciamento de Memória

Fragmentação• Blocos não contiguos• Memória disponível espalhado entre pequenos

blocos de memória• É necessário reorganizar e compactar a memória

usada e disponível

Page 6: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

20/08/2009 Copyright: Claudio Miranda - Evento Escola Regional de Informática do Centro Oeste 1 10

Gerenciamento de Memória

• Fragmentação

Page 7: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Gerenciamento de Memória

Recolocação• Mover dados entre áreas de memória• Colocar os dados mais acessados em estrutura

otimizadas (MRU, LRU, etc.)• Atualizar as referências

Page 8: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Gerenciamento de Memória

Compactação• Evitar fragmentação• Remover espaços não usados de objetos

contiguos• Reorganização da memória usada e não usada

Page 9: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Page 10: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Gerenciamento de Memória

Page 11: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Gerenciamento de Memória

Gerenciamento Automático• Quando o programador não precisa se preocupar

com as tarefas anteriores• Atividades baseadas em padrões de uso da

memória• Também chamado de Garbage Collector

Page 12: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

HEAP

-Xmx2g

Page 13: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

• Larga área de memória que armazena objetos e suas referências

• É dividido em geraçõesGeração Young (ou New ou Eden)Geração Old (Tenured)Geração Permanente (PermGem)

• O GC ocorre apenas quando a geração não tem espaço para alocação de novos objetos

• Automaticamente remove objetos da memória que não possuem referência

• Possui diferentes algoritmos de GC

Page 14: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

YOUNG OLD

-XX:MaxNewSize=256m-Xmx2g

Page 15: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

• Geração YoungOnde novos objetos são alocados A alocação de memória é de curta duraçãoObjetos que não possuem referência são

removidos pelo GCGC ocorre com mais frequência Tamanho pequeno

private String name = “Bruce Lee”;public Result consumidor(Long id) { Result r = processar(id); return r;}

Page 16: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

YOUNG OLD

-XX:MaxNewSize=256m-Xmx2g

Page 17: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

• Geração OldOnde permanecem objetos cujas referências

sobreviveram ao GC da área YoungObjetos de longa duraçãoGC ocorre com menor frequência Tamanho superior à área Young Exemplos:

• Atributos estáticos, final, Singleton

public static String name = “Bruce Lee”;public final Map cache = new HashMap();private static Loader singleton = new Loader();

Page 18: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

YOUNG OLD

-XX:MaxNewSize=256m-Xmx2g

Perm

-XX:MaxPermSize=128m

Page 19: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

• Geração PermanenteNão sofre ação de GCArmazena a estrutura das classesArmazena informações de reflexãoNão participa do heap (-Xmx)

Page 20: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

Eden To Eden(survivor 2)

From Eden(survivor 1)

Criação de objetos

Page 21: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

Eden To EdenFrom Eden

Ocorre um GC na área Young

Page 22: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

Ocorre outro GC na área Young

Eden To EdenFrom Eden

Page 23: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

Outro GC ocorre, então objetos que contém referência são transportados para a área Old

OldTo Eden

Page 24: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Heap

Old

• Na área de memóra Old ocorremRedimensionamento (-Xms ≠ -Xmx)Compactação (desfragmentação) Larga área de memória

para ser monitoradaGC ocorre de acordo com

a política do algorítmo

Page 25: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Algoritmos de GC

• Algoritmos diferentes para cada geração• Escolhas entre consumo de CPU e pausas

maiores

Page 26: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Algoritmos de GC

• Serial• Parallel• Stop the world• Concurrent• Compacting• Non compacting• Copying

Page 27: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Algoritmos de GC

• Parallel

• Serial

Page 28: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Algoritmos de GC

• Stop the world Todas as threads são pausadas Longas pausas

• Concurrent Tarefas de GC efetuadas enquanto a aplicação

funcionaMaior consumo de CPUMenor pausa

Page 29: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Algoritmos de GC

• CompactingRealocar todos os objetos e liberar memória

• Non CompactingApenas libera os blocos de memória

• CopyingCopia os objetos para qualquer área de

memória não prioritária Libera o espaço

Page 30: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

Algoritmos de GC

• Atualmente os algoritmos mais usados sãoParalelo

• UseParallelGC • UseParallelOldGC

Concorrente• UseConcMarkSweepGC

• Um recente algoritmo foi lançado G1

• Concorrente + paralelo

Page 31: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

• Não chame System.gc organize e reuse seus objetos

• Ao criar estruturas de dados, informe o tamanho new ArrayList(330);

• Use Weak References• Não abuse da concatenação de StringsUse StringBuilder

• Use static quando necessário• Política de limpeza de caches

Dicas

Page 32: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

• Em estruturas grandes apontar para null, após o uso

• Configurar os parametros de memória-Xmx -Xms -Xss

• Escolher apropriadamente o algoritmo da geração

• Faça testes de performance• Use ferramentas para auxílio de diagnósticoProfilerMonitoramento

Dicas

Page 33: Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java

• Em estruturas grandes apontar para null, após o uso

• Configurar os parametros de memória-Xmx -Xms -Xss

• Escolher apropriadamente o algoritmo da geração

• Faça testes de performance• Use ferramentas para auxílio de diagnósticoProfilerMonitoramento

Dicas