Memória e Garbage Collection na JVM

16
Eduardo Bohrer @nbluis http://about.me/nbluis Memória e GC na JVM

Transcript of Memória e Garbage Collection na JVM

Garbage collection

Presente nas linguagens modernas

Remove automaticamente objetos não mais utilizados

Para entender o GC precisamos entender a memória e vice e versa

Garbage collection

Reference counting

Mark and sweep

Generational copying

Reference counting

Mais simples

1 fase

Remove objetos que não tem mais referências

Exemplo: Objective-c

Mark and sweep

Mais comum

2 fases

Marca todos os objetos que tem referências

Remove todos os objetos não marcados

Exemplo: Ruby

Generational copying

Mais rebuscado

Multiplas fases

Exemplo: Java

Generational copying

Hipótese das gerações

95% dos objetos criados tem uma vida extremamente curta, os outros 5% normalmente tem uma vida bastante longa

Generational copying

Memória dividida em 2 partes

“Young memory”

“Old memory”

Young memory

Onde todos os objetos são criados

Quando enche, o GC procura por objetos que ainda tem referências e move para a “Old memory”

Tudo o que sobrar é descartado/ignorado

Old memory

Carrega os objetos “sobreviventes”

Não é afetado pelo “minor collect”

Quando enche, obriga um “major collect” mais conhecido como “full gc”

Nesse caso utilizando Mark and sweep

Benefícios

Aguarda o acúmulo do “young” para fazer gc

Diminui a quantidade de coletas

Diminui a fragmentação da memória

O minor collect roda em uma pequena parte da memória, diminuindo o overhead

Opera apenas sobre os 5% que sobraram e não sobre os 95% que serão ignorados

Generational e a JVM

A JVM extende a estratégia das gerações

Na JVM existem dois tipos de memória

Heap - Memória da aplicação

Non-Heap - Memória da JVM

JVM Heap

Onde ficam todos os objetos do aplicativo

Onde ocorre o famoso “java.lang.OutOfMemoryError: Java heap space”

JVM Non-Heap

Mais conhecida como PermGen

Onde a JVM guarda Classes, Metodos e o StringPool

Onde ocorre o também famoso “java.lang.OutOfMemoryError: PermGen space”

JVM Heap

Segue a estratégia “generational copying”

Porém com a memória dividida em 3 partes

Eden (young)

Survivor

Tenured (old)

JConsole

$JAVA_HOME/bin/jconsole