Você está na página 1de 87

Java

Tpicos selecionados de programao em

Gerncia de Memria em Java


Parte I: Arquitetura da JVM e algoritmos de coleta de lixo
Helder da Rocha
Setembro 2005 1

Por que gerenciar memria?


H linguagens em que a alocao de memria trivial, e no requerem gerenciamento complexo Estratgias de alocao de memria
Esttica: reas de memria so alocadas antes do incio do programa; no permite mudanas nas estruturas de dados em tempo de execuo (ex: Fortran) Linear: memria alocada em fila ou em pilha; no permite remoo de objetos fora da ordem de criao (ex: Forth) Dinmica: permite liberdade de criao e remoo em ordem arbitrria; requer gerncia complexa do espao ocupado e identificao dos espaos livres (ex: Java, C++)

Java utiliza alocao dinmica (heap) para objetos e alocao linear (pilha) para procedimentos seqenciais
Mas todo o gerenciamento feito automaticamente
2

Gerencia de memria? Em Java?


Ento, por que se preocupar com memria em Java?
Diferentemente de C ou C++, programadores Java no tm a responsabilidade e nem a possibilidade de gerenciar a memria do sistema explicitamente Programao em alto-nvel: alocao e liberao de memria dinmica realizada automaticamente usando algoritmos: programador preocupa-se apenas com a lgica do programa

Mas algoritmos so configurados para situaes tpicas


Determinadas aplicaes podem requerer ajustes (tuning): performance, escalabilidade, segurana, throughput vs. liveness Saber o quanto, quando, onde ajustar requer conhecimentos elementares da organizao da memria e dos algoritmos de coleta de lixo empregados pela implementao da JVM usada
3

Assuntos abordados
Este minicurso explora detalhes sobre o uso de memria virtual em aplicaes Java Est dividido em trs partes
Parte I: este mdulo (arquitetura da JVM, alocao de memria e algoritmos de coleta de lixo) Parte II: arquitetura da HotSpot JVM e estratgias de ajuste e otimizao de performance Parte III: finalizao, controle do coletor de lixo, memory leaks e objetos de referncia

Tpicos deste mdulo (primeira parte)


1. Anatomia da JVM 2. Coleta de lixo: algoritmos elementares 3. Coleta de lixo: algoritmos combinados (estratgias) 4. Coleta de lixo em paralelo (coletores no-seriais)
4

1. Anatomia da JVM
A mquina virtual Java (JVM) uma mquina imaginria implementada como uma aplicao de software [JVMS]
Ela executa um cdigo de mquina portvel (chamado de Java bytecode) armazenado em um formato class O formato class geralmente gerado como resultado de uma compilao de cdigo-fonte Java
javac
F4 FE 01 3D D9 FF 2E 29 00 03 0A B2 FF 09 02 01 2F 30 62 84 3A C1 00 00 HelloWorld.class

java
Class Loader Classe remota?

sim

Bytecode Verifier

no

class HelloWorld { public static void main(String[] args) { System.out.println("Hello, world!"); } } Tradutor JIT: Just-In-Time Compiler. Gera cdigo nativo a partir de bytecodes

Tempo de execuo
Interpretador Tradutor JIT
cdigo nativo

HARDWARE

Java esconde detalhes da memria


A especificao da mquina virtual (Java Virtual Machine Specification [JVMS]) no determina:
Detalhes de segmentao da memria (como ocorre o uso de memria virtual, onde fica a pilha, o heap, etc.) O algoritmo de coleta de lixo usado para liberar memria (diz apenas que deve haver um) Outros aspectos de baixo nvel como formato de tipos, etc.

Diferentes implementaes da JVM tm a liberdade de organizar a memria diferentemente e escolher algoritmos de coleta de lixo diferentes
Sun HotSpot JVM (mais popular; a da IBM similar) Jikes RVM (experimental; popular entre cientistas)
6

A pilha, o heap e a JVM


Do ponto de vista de um programador Java, as reas de memria virtual conhecidas como a pilha e o heap so lugares imaginrios na memria de um computador
No interessa nem adianta saber onde esto Java no oferece opes de escolha: tipos primitivos ficam na pilha e objetos ficam no heap e ponto final!

Implementaes da especificao da JVM, (como a HotSpot JVM), oferecem parmetros que permitem algum controle sobre a gerncia de memria
Conhecer as escolhas de algoritmos e arquitetura da mquina virtual usada importante para saber como configur-la e quais parmetros ajustar para obter melhor performance Ainda assim, o controle limitado e no existe, em Java, a disciplina gerncia de memria como existe em C ou C++
7

Segmentao de memria virtual:


esquema lgico de baixo nvel
O diagrama ao lado apenas um modelo genrico* e no reflete nenhuma implementao real
Os blocos azuis no heap indicam memria alocada dinamicamente Os blocos amarelos na pilha podem indicar frames (seqncias de instrues de cada mtodo) de um nico thread As setas azuis indicam ponteiros
* Modelo inspirado em segmentao C/C++. A especificao da JVM descreve a memria em nvel mais alto (ex: no sugere onde o heap ou pilha devem ser localizados, no descreve organizao do heap, permite pilha no contgua, etc.)
Heap Pilha Registradores SP PC 8

Dados globais (RW) Instrues (RX)


PC = Program counter SP = Stack pointer

Anatomia da JVM: reas de dados


A mquina virtual define vrias reas de dados que podem ser usadas durante a execuo de um programa
Pilhas e segmentos de pilha (quadros) Heaps e rea de mtodos Registradores
Heap (compartilhado) Method area
Cdigo compilado Pool de constantes

Algumas reas esto associadas a threads (privativas)


So criadas/alocadas quando um thread novo criado So destrudas/liberadas quando o thread termina
Registrador PC (um por thread)

Pilhas (uma para cada thread) Quadro (um por mtodo) Variveis locais

Outras reas esto ligadas mquina virtual (compartilhadas)


Criadas quando a JVM iniciada Destrudas quando a JVM termina
...

...

Pilha de operandos

Quadro
9

O registrador PC
Cada thread de execuo tem um registrador PC (program counter) Em qualquer momento, cada thread estar executando o cdigo de um nico mtodo
Um mtodo (Java ou bytecode) consiste de uma lista de instrues executadas em uma seqncia definida

O registrador PC contm o endereo da instruo da JVM que est sendo executada


O valor do registrador PC s no definido se o mtodo for um mtodo nativo (implementado em linguagem de mquina da plataforma onde roda)
10

Pilhas da JVM
Cada thread criado com uma pilha associada
usada para guardar variveis locais e resultados parciais
.9999e23

A memria usada pela pilha


this 349F

Pode ser alocada no heap No precisa ser contgua liberada automaticamente depois de usada Pode ter um tamanho fixo ou expandir-se e contrair-se na medida em que for necessrio (implementaes de JVM podem oferecer controles para ajustar tamanho de pilhas)
25 0 0 0

Quando a memria acaba, dois erros podem ocorrer


StackOverflowError: se a computao de um thread precisar de uma pilha maior que a permitida (mtodos que criam muitas variveis locais, funes recursivas) OutOfMemoryError: se no houver memria suficiente para expandir uma pilha que pode crescer dinamicamente.
11

this

this

Quadros de pilha (frames)


Um quadro (frame) um segmento alocado a partir da pilha de um thread, sempre que um mtodo chamado
criado cada vez que um mtodo chamado (todo mtodo tem um quadro associado) destrudo quando a chamada termina (normalmente ou no) sempre local ao thread (outros threads no tm acesso a ele)

usado para
guardar resultados parciais e dados realizar ligao dinmica retornar valores de mtodos despachar excees
this 0 349F this 25 .999e23 34A3 this

Cada quadro possui

Um array de variveis locais 0 Uma pilha de operandos Referncia ao pool de constantes de runtime da classe corrente.

12

Quadros correntes e chamadas


Em um determinado thread, apenas um quadro est ativo em um determinado momento
Chama-se quadro corrente Seu mtodo o mtodo corrente Sua classe a classe corrente
this 0 349F

m2()
this 7 .7e2

Quando o mtodo corrente m1, associado ao quadro q1, chama outro mtodo m2

m1()

this

Um novo quadro q2 criado (que m2() 0 passa a ser o quadro corrente) this 490.0 Quando o mtodo m2 retornar, o 1234 7 quadro q2 retorna o resultado da .7e2 m1() sua chamada (se houver) ao quadro q1 O quadro q2 descartado e q1 volta a ser o quadro corrente
13

Variveis locais
Cada frame possui um vetor de variveis contendo as variveis locais do seu mtodo associado.
Variveis de at 32 bits ocupam um lugar no array Variveis de 64 bits ocupam dois lugares consecutivos
0 1 0 1 2 2

Variveis locais de mtodo esttico


args h sum i

So usadas para passar parmetros durante a chamada de mtodos Variveis locais de Variveis locais so acessadas mtodo de instncia pelo seu ndice (a partir de 0)

this x y

soma(x,y)

Em mtodos estticos, a varivel local de ndice 0 o primeiro parmetro passado ao mtodo Em mtodos de instncia, a varivel local de ndice 0 sempre contm a referncia this; os parmetros so passados a partir da varivel local de ndice 1

main(args) { Hello h=... int sum=... for(int i= ...

14

Pilha de operandos
Cada quadro contm uma pilha LIFO conhecida como Pilha de Operandos
(7) astore_1 (14) istore_2

0xFF 7

Quando o quadro criado, a pilha vazia (16) istore_3 0 Instrues da mquina virtual carregam constantes ou valores de variveis locais ou campos de dados para a pilha de operandos, e vice-versa A pilha de operandos tambm serve para preparar parmetros a serem passados a mtodos e para receber seus resultados

Qualquer tipo primitivo pode ser armazenado e lido da pilha de operandos.


Tipos long e double ocupam duas unidades da pilha.

Operaes sobre a pilha de operandos respeitam os tipos dos dados guardados


15

Cdigo Java e instrues de pilha


0

2: public class HelloWorld { 3: public HelloWorld() {} 4: public int sum(int x, int y) { 5: 6: 7: return (x + y); } public static void main(String[] a) {

0: 1: 2: 3:

iload_1 iload_2 iadd ireturn

this x y

1 2

Instrues de mquina
0: 3: 4: 7: 8: 9: 10: 11: 14: 15: 16: 17: 18: 19: 22: 25: 26: 29: 32: 35: new #2; dup invokespecial #3; astore_1 aload_1 iconst_3 iconst_4 invokevirtual #4; istore_2 iconst_0 istore_3 iload_3 iload_2 if_icmpge 35 getstatic #5; iload_3 invokevirtual #6; iinc 3, 1 goto 17 return

Arrays de variveis locais

0 1 2 3

8:

HelloWorld h = new HelloWorld();

a h sum i

9:

int sum = h.sum(3, 4);

10:

for (int i = 0; i < sum; i++ ) {

Pilha de operandos
(7) (14) (16)

11: System.out.println(i); 15: } 13: } 14:}

&h 7 0

PC

16

O heap
O heap a rea de dados onde todas as instncias e vetores so alocados
Compartilhada por todos os threads Criada quando a mquina virtual iniciada No precisa ser uma rea contgua

O espao de objetos no heap reciclado por um sistema de gerenciamento de memria (coletor de lixo)
Algoritmo depende da implementao da JVM

Pode ter tamanho fixo ou ser expandido/contrado


Implementaes podem oferecer controles para ajustar tamanho do mnimo/mximo ou fixo do heap

Se um programa precisar de mais heap que o que foi disponibilizado, a JVM causar OutOfMemoryError.
17

rea de mtodos
Parte do heap usada para guardar cdigo compilado de mtodos e construtores
Criada quando a mquina virtual inicia Geralmente armazenada em uma rea de alocao permanente (a especificao no determina a localizao) Compartilhada por todos os threads
Resto do heap

Method area
Cdigo compilado Pool de constantes

Guarda estruturas compartilhadas por todos os mtodos de uma classe como


Pool de constantes de runtime (constantes de diversos tipos usados pelo mtodo) Dados usados em campos e mtodos

OutOfMemoryError ocorre se em algum momento no houver mais espao para armazenar cdigo de mtodos
18

Ferramenta javap
Para obter informaes sobre a estrutura de uma classe e instrues da JVM usadas use javap c Classe A ferramenta javap permite visualizar o contedo de um arquivo de classe
javap [-opes] classe

Usando opes c e verbose possvel ver


Seqncia de instrues da JVM Tamanho dos quadros de cada mtodo Contedo dos quadros Pool de constantes

Opo l imprime tabela de variveis locais Sem opes, mostra a interface da classe
19

2. Algoritmos de coleta de lixo


Dados armazenados na pilha so automaticamente liberados, quando a pilha esvazia para ser reutilizada Mas dados armazenados no heap precisam ser reciclados atravs de liberao...
... manual, em linguagens como C e C++ (freelists, delete, free) ... automtica, como em Java e maior parte das linguagens*

Liberao automtica de memria do heap realizada atravs de algoritmos de coleta de lixo


H vrias estratgias, com vantagens e desvantagens de acordo com a taxa em que objetos so criados e descartados Tm considervel impacto na performance (gerncia explcita de memria tambm tem, e muito mais complicada)
* Perl, Python, Rubi, Basic, LISP, Algol, Dylan, Prolog, PostScript, Scheme, Simula, Smalltalk, ML e Modula-3 (na maior parte suporta controle manual em alguns mdulos)
20

Coleta de lixo
De acordo com a especificao da linguagem Java, uma JVM precisa incluir um algoritmo de coleta de lixo para reciclar memria no utilizada (objetos inalcanveis)
A especificao no informa qual algoritmo deve ser usado apenas que deve existir um A mquina virtual HotSpot, da Sun, usa vrios algoritmos e permite diversos nveis de ajuste*

O comportamento desse algoritmo o principal gargalo na maior parte das aplicaes de vida longa
Em mdia: 2% a 20% do tempo de execuo de uma aplicao tpica gasto com coleta de lixo Conhecer os detalhes do funcionamento do algoritmo de coleta de lixo importante para saber como ajust-lo para melhorar a eficincia de um sistema
* Novos algoritmos so suportados a cada nova verso
21

Desafios da coleta de lixo


Distinguir o que lixo do que no lixo
Algoritmos exatos garantem a identificao precisa de todos os ponteiros e a coleta de todo o lixo Algoritmos conservadores faz suposies e pode deixar de coletar lixo que pode no ser lixo (possvel memory leak) Todos os coletores usados nas JVMs atuais so exatos

Influncia da coleta em alocaes posteriores


A remoo de objetos deixa buracos no heap (fragmentao) Para alocar novos objetos, preciso procurar nas listas de espaos vazios (free lists) um que caiba o prximo objeto: alocao ser mais demorada e uso do espao ineficiente. Alguns algoritmos compactam o heap, movendo os objetos para o incio do heap e atualizando os ponteiros: torna a alocao mais simples e eficiente, porm so mais complexos.
22

Algoritmos para coleta de lixo


Contagem de referncias
Reference counting algorithm: mantm, em cada objeto, uma contagem das referncias para ele; coleta os objetos que tm contagem zero Cycle collecting algorithm: extenso do algoritmo de contagem de referncia para coletar ciclos (referncias circulares)

Rastreamento de memria
Mark and sweep algorithm: rastreia objetos do heap, marca o que no lixo e depois varre o lixo (libera memria) Mark and compact algorithm: extenso do algoritmo Mark and Sweep que mantm o heap desfragmentado Copying algorithm: divide o heap em duas partes; cria objetos em uma parte do heap e deixa outra parte vazia; recolhe o que no lixo e copia para a rea limpa, depois esvazia a rea suja
23

Estratgias de coleta de lixo


Algoritmos combinados
Estratgias usam ou baseiam-se em um ou mais dos algoritmos citados para obter melhores resultados em um dado cenrio

Classificao quanto organizao da memria


Generational (objetos transferidos para reas de memria diferentes conforme sobrevivem a vrias coletas de lixo) Age-oriented (algoritmos diferentes conforme idade dos objetos)

Classificao quanto ao nvel de paralelismo


Serial Incremental Concorrente

Principal argumento de escolha: eficincia vs. pausas


24

Metas ajustveis
Eficincia (throughput): tempo til / tempo de faxina
Taxa entre o tempo em que uma aplicao passa fazendo sua funo til dividido pelo tempo que passa fazendo coleta de lixo Ideal que seja a maior possvel

Pausas: quando o mundo pra (stop-the-world)


Tempo em que a aplicao inteira (todos os threads) da aplicao param para roda o GC e liberar memria Ideal que seja o menor possvel

Como alcanar essas metas?


Escolhendo um coletor de lixo adequado (diferentes estratgias usam algoritmos diferentes, de formas diferentes) Configurando parmetros que modificam o espao usado, influenciando a forma como o coletor gerencia memria
25

Contagem de referncias (RC*)


o algoritmo mais simples [Collins 1960] Cada objeto possui um campo extra que conta quantas referncias apontam para ele
Compilador precisa gerar cdigo para atualizar esse campo sempre que uma referncia for modificada

Funcionamento:
Objeto criado em thread ativo: contagem = 1 Objeto ganha nova referncia para ele (atribuio ou chamada de mtodo com passagem de referncia): contagem++ Uma das referncias do objeto perdida (saiu do escopo onde foi definida, ganhou novo valor por atribuio, foi atribuda a null ou objeto que a continha foi coletado): contagem- Se contagem cair a zero, o objeto considerado lixo e pode ser coletado a qualquer momento
*RC = Reference Counting
26

Contagem de referncias (1)


Cada seta que chega em um objeto contada como uma referncia para ele (independente de onde tenha vindo)
Heap 1 1 1 1 1 1 1 1 1 2 1 2 1 0 0 3 1 1 3 1 1 1 1 1 1 1
27

Conjunto raiz

a b

c d e

Contagem de referncias (2)


Referncias circulares impedem que contagem caia para zero quando deveria.
Heap 0 0 2 1
e saiu de
escopo {...}

Conjunto raiz
a = null;

Memory leak! Objetos inalcanveis que no sero coletados!

a b

0 0 1 1 1

0 1 1 0 0 2

1 1

1 1 1

b = c;

c d e

1 1

1 1
28

RC: consideraes
Vantagens
Rpido: no precisa varrer o heap inteiro (s espao ocupado) Pode executar em paralelo com a aplicao

Desvantagens do RC clssico
Overhead alto Paralelismo caro Incapacidade de recuperar ciclos (objetos que mantm referncias circulares entre si)

Solues
Coletores incrementais RC on-the-fly [Levanoni-Petrank 2001] reduzem overhead e custo do paralelismo, sem pausas Algoritmo eficiente de Coleta de Ciclos [Paz-Petrank 2003] ou backup com algoritmo de rastreamento (MS ou MC)
29

Coleta de ciclos (CC)


Contagem de referncias clssica no recolhe ciclos Coleo de ciclos baseia-se em duas observaes
Obs1: Ciclos-lixo s podem ser criados quando uma contagem cai para valor diferente de zero Obs2: Em ciclos-lixo, toda a contagem devido a ponteiros internos

Portanto, objetos que tem contagem decrementada para valores diferente de zero so candidatos (obs1) Algoritmo realiza trs passos locais nos candidatos
1. Mark: marca apenas objetos que tm ponteiros externos (obs2) 2. Scan: varre o ciclo a partir do objeto candidato com ponteiro externo e restaura a marcao de objetos que forem alcanveis 3. Collect: coleta os ns cuja contagem for zero

30

CC: identifica candidatos remoo


Candidatos: objetos cuja contagem foi decrementada para valor diferente de zero
Conjunto raiz
a = null;

Heap 0 0 2 1 0 0 1 1 1 0 1 1 0 0

Candidato: reduziu de 2 para 1

a b

1 1

1 1 1

b = c;

c d e
e saiu de
escopo {...}

1 1

1 1
31

Candidato: reduziu de 3 para 2

CC: passo 1 - mark


Navega nas referncias a partir do candidato e conta apenas as referncias externas ao ciclo contagem de
Conjunto raiz
a = null;

Heap 0 0 2 1 0 0 1 1 1 0 1 1 0 0 1 0

referncias externas

a b

0 0

0 0 0

b = c;

c d e
e saiu de
escopo {...}

0 0

0 0
32

Uma referncia externa

CC: passo 2 - scan


Restaura contagem dos ns que forem acessveis atravs das referncias externas
Conjunto raiz
a = null; inaccessveis

Heap 0 0 2 1 0 0 1 1 1 0 1 1 0 0 2 1 1 0 0 0 0 0 1 1 1
33

a b

b = c;

c d e
e saiu de
escopo {...}

accessveis (contagem restaurada)

CC: consideraes
Vantagens
Trabalha com objetos ativos (no precisa pesquisar todo o heap) Pode trabalhar em paralelo com a aplicao (no pra tudo)

Desvantagens
Ineficiente se houver muitos ciclos (precisa passar trs vezes por cada um deles) Quando trabalha em paralelo, precisa garantir atomicidade das etapas de coleta de ciclos (complexo em multiprocessadores)

Solues que usam CC


Efficient age-oriented concurrent cycle collector [Paz et al. 2005]

Uso experimental apenas (Jikes RVM)


A JVM HotSpot no tem, at o momento, empregado nenhum tipo de algoritmo de contagem de referncias (at Java 5.0)
34

Algoritmos de rastreamento*
Marcam as referncias que so alcanveis (navegando a partir do conjunto raiz), e remove todas as que sobrarem
Conjunto raiz Heap

a b
x x x

c d e * tracing

35

Algoritmo Mark and Sweep (MS)


o mais simples algoritmo de rastreamento (tracing) executado quando a memria do heap atinge um nvel crtico (ou acaba) Todos os threads da aplicao param para execut-lo
Comportamento chamado de Stop-the-World

Originalmente projetado para a linguagem LISP pelo seu criador [McCarthy 1960] Duas fases
Mark: navega pelos objetos alcanveis a partir do conjunto raiz e deixa uma marca neles Sweep: varre o heap inteiro para remover os objetos que no estiverem marcados (lixo), liberando a memria
36

MS: o heap antes da coleta


a b Referncias do conjunto raiz

Heap

37

MS: fase de marcao: Mark


a b Objetos que o garbage collector no conseguiu alcanar
X X

X X X

Heap

38

MS: fase da faxina: Sweep


a b Objetos que no foram marcados foram varridos do heap!

Heap

39

MS: alocao de novos objetos


a b c

H fragmentao no heap! A utilizao ineficiente!

Esta a primeira parte do heap onde o objeto cabe Heap


40

MS: consideraes
Vantagens
No precisa de algoritmo complicado para remover objetos com referncias circulares Pode ser mais rpido que contagem de referncias se heap no for excessivamente grande e objetos morrerem com freqncia

Desvantagens
Interrompe a aplicao principal (provoca pausa) Fragmentao pode aumentar a freqncia em que o CG ocorre, com o tempo Precisa visitar todos os objetos alcanveis na fase de marcao e varrer o heap inteiro para localizar objetos no marcados e liberar a memria
41

Algoritmo Mark-Compact (MC)


[Edwards]

Algoritmo de rastreamento baseado no algortmo mark-sweep (MS)


Acrescenta um algortmo de compactao que no provoca fragmentao de memria

Duas fases
Mark: idntica ao mark-sweep Compact: objetos alcanveis so movidos para frente at que a memria que ocupa seja contgua

Tambm Stop-the-World
Precisa interromper a aplicao para rodar
42

MS: fase de marcao: Mark


a b Objetos que o garbage collector no conseguiu alcanar
X X

X X

Igual a Mark-Sweep

Heap

43

MC: fase de compactao: Compact


a b

A compactao requer execuo de algoritmo adicional (mais complexo que MS) Heap

Objetos marcados so movidos para os espaos vazios do incio do heap

44

MC: alocao de novos objetos


a b c

Heap de objetos contguos: mais eficiente! Heap

45

MC: consideraes
Vantagens
No causa fragmentao da memria: alocao rpida e performance no se degrada com o tempo devido ao aumento das coletas

Desvantagens
Continua sendo Stop-the-World e pausas tendem a ser maiores que as pausas em MS O algoritmo de compactao tem overhead (requer vrias visitas) e mais complicado de implementar em CGs concorrentes (multiprocessadores)

Veja exemplo grfico interativo de algoritmo MarkSweep-Compact (applet Java Heap of Fish)
http://www.artima.com/insidejvm/applets/HeapOfFish.html (Bill Venners, do livro Inside the Virtual Machine) [Venners]
46

Algoritmo de cpia: CA
Copying algorithm [Chenney 1970] Divide o heap em duas reas iguais chamadas de origem (from space) e destino (to space) Funcionamento
1. Objetos so alocados na rea from 2. Quando o coletor de lixo executado, ele navega pela corrente de referncias e copia os objetos alcanveis para a rea to 3. Quando a cpia completada, os espaos to e from trocam de papel
47

CA: antes da coleta


a b Heap dividido em duas partes (no necessariamente, iguais mas geralmente de tamanho similar) Desperdcio: h metade do espao anterior para alocao de novos objetos! Heap origem: From Heap destino: To
48

CA: copia objetos alcanveis


a b

Objetos que forem alcanveis a partir do conjunto raiz so copiados medida em que so encontrados Referncias so atualizadas
Heap origem: From Heap destino: To
49

CA: esvazia e troca de papel


a b

Toda a rea de memria do heap origem liberada Troca de ppis: a rea do heap que era destino torna-se origem e a origem torna-se destino Alocao passa a ocorrer em outra rea do heap
Heap destino: To Heap origem: From
50

AC: alocao de novos objetos


a b c

No h fragmentao. Heap de objetos contguos torna novas alocaes mais eficientes! Mas metade do heap no utilizado
Heap destino: To Heap origem: From
51

AC: consideraes
Vantagens
Cpia rpida, principalmente se a quantidade de objetos alcanveis for pequena (o que comum) No precisa visitar o heap inteiro: apenas objetos alcanveis No fragmenta a memria do heap

Desvantagens
Aplicao precisa parar (stop-the-world) enquanto o algoritmo est sendo executado (como em qualquer algoritmo de rastreamento); verso concorrente [Baker] tem menos pausas Dobra a necessidade de memria do heap: um problema se o heap necessrio for muito grande; heaps menores (com metade do tamanho normal) podem disparar o GC com mais freqncia, reduzindo o throughput Uso ineficiente de memria (metade est sempre vazia)
52

Comparao (em coletor serial)


Em vermelho, geralmente um critrio negativo
* o* i ro ap M* te V he a in c tJ o p li o d o ea ap Sp al ap x h t t li he to ra er o Ho a r o o ar ar do no ta us v p n to o e d ite isa isa ta m m c c sa e g l r e e u co fra pe pr pr

Contagem de referncias Coleo de ciclos Mark-sweep Mark-compact Copying

no no sim sim no

no sim sim sim sim

no no sim sim sim

sim sim sim no no

sim sim sim sim no

no no sim sim sim


53

* no funciona de forma incremental (stop-the-world)

** at verso 5.0

3. Estratgias de coleta de lixo


Coletores modernos combinam vrios algoritmos em estratgias mais complexas
Aplicando algoritmos diferentes conforme as idades e localizao dos objetos Utilizando tcnicas que possibilitem a coleta de lixo paralela (algoritmos incrementais e concorrentes)

Nesta seo apresentaremos as principais estratgias usadas (e propostas) para coletores seriais e paralelos
Generational garbage collection (usada na JVM HotSpot) Age-oriented garbage collection (em fase experimental)

Ambas baseiam-se na idade dos objetos para tornar as coletas mais eficientes
54

Vida dos objetos


Observaes empricas
1. Se um objeto tem sido alcanvel por um longo perodo, provvel que continue assim 2. Em linguagens funcionais, a maior parte dos objetos morre pouco depois de criados 3. Referncias de objetos velhos para objetos novos so incomuns

Concluso
Pode-se tornar mais eficiente o coletor de lixo se analisando os objetos jovens com mais freqncia que os objetos mais velhos
55

Mortalidade infantil dos objetos


Objetos morrem jovens!
A maior parte, pouco depois de serem alocados
Coletas menores Coletas maiores (Full GC)

bytes sobreviventes

bytes alocados

Fonte: Sun [Sun 05]

56

Generational GC
[Lieberman-Hewitt 83] e [Ungar 84]

Classifica objetos em diferentes geraes: G0, G1, ...


G0 contm objetos jovens recm-criados Pressupe-se que a maior parte dos objetos jovens (90%) lixo antes da prxima coleta Gn varrida mais freqentemente que Gn+1 Objetos sobreviventes so promovidos para a gerao seguinte

As geraes mais velhas devem ser maiores que as geraes mais novas
Tipicamente so exponencialmente maiores

Implementaes tpicas usam apenas duas geraes


Gerao jovem (G0) Gerao estvel (G1)
57

Fundamentos do Generational GC
Duas hipteses
Mortalidade infantil dos objetos: a maior parte dos objetos (95%) morre pouco depois que so criados Haver poucas referncias de objetos mais velhos para objetos mais jovens

As geraes so reas do heap


Gerao jovem: rea menor, onde inicialmente alocada a memria para novos objetos Gerao antiga, ou estvel: rea maior, para onde so copiados objetos que sobrevivem a uma ou mais coletas de lixo na rea menor
58

Ponteiros entre geraes


Quando um objeto criado, suas referncias geralmente apontaro para objetos mais antigos
Se houver ponteiros entre geraes, provavelmente sero da gerao nova para a gerao velha

Pode acontecer de um objeto antigo receber referncia para um objeto novo algum tempo depois de criado
Neste caso o sistema precisa interceptar modificaes em objetos antigos e manter uma lista de referncias Isto deve ocorrer raramente (se ocorrer com freqncia, as coletas menores sero demoradas)

Na HotSpot JVM, usada uma tabela de referncias


Gerao antiga dividida em blocos de 512kb (cards) Alteraes so interceptadas e blocos so marcados Coletas menores verificam apenas blocos marcados
59

Generational GC: algortmos


Usa mais de um algortmo, uma vez que cada gerao possui tamanhos e comportamentos diferentes Gerao jovem
90% dos objetos esto mortos rea total do heap usado pequeno Algoritmo de cpia a melhor opo pois seu custo proporcional aos objetos ativos

Gerao estvel
Pode haver muitos objetos ativos e rea grande No h unanimidade quanto ao algoritmo Pesquisas recentes exploram o uso de algoritmos de contagem de referncia (CC) com coletas freqentes e incrementais HotSpot usa MS (na verso concorrente) e MC
60

Funcionamento: generational GC
Ilustrando caso tpico (h muitas variaes)
Duas geraes (G0: jovem e G1: estvel) Algoritmo de cpia usado na gerao jovem

Quando cada gerao enche, ocorrem coletas de lixo


Parciais na gerao jovem, e completas no heap inteiro

GC Parcial: A gerao jovem enche primeiro, j que acumula objetos mais rapidamente
Quando a gerao jovem enche, causa uma coleta menor, que rpida (proporcional ao nmero de objetos ativos) Sobreviventes da coleta sero copiados para a gerao antiga

GC Completa: A gerao antiga cresce ao receber os sobreviventes da gerao jovem. Vrios iro morrer.
Depois de vrias coletas menores, a gerao antiga enche Quando encher, haver uma coleta maior (lenta) no heap inteiro
61

Funcionamento ilustrado
Gerao jovem recebe novas alocaes at encher Quando a gerao jovem enche ocorre a coleta que copia os objetos sobreviventes para a gerao estvel Coleta na gerao estvel mais demorada, porm menos freqente
a
Referncias raiz

b c
Novas alocaes

d e
Objetos sobreviventes

Gerao jovem

b a c

Gerao estvel

Primeira coleta da gerao jovem

Segunda coleta da gerao jovem

62

Consideraes
Vantagens
Pausas menores: coletas rpidas e freqentes distribuem as pausas que podem tornar-se imperceptveis Eficincia (throughput): a coleta concentra-se nas reas de memria onde o lixo se encontra, gastando menos tempo

Desvantagens
Pequena gerao jovem pode causar incio mais lento devido a muitas coletas curtas (baixa eficincia) Coleta na gerao antiga ainda lenta e algoritmos usados atualmente ainda no conseguem eliminar pausas

Implementaes
Na JVM HotSpot, gerao antiga usa diversos algortmos (MC, MS) H pesquisas usando RC (CC) para coletar gerao antiga eficientemente: [Azatchi-Petrank 03] e [Blackburn-Mckinley 03] com implementaes experimentais testadas no Jikes RVM
63

Age-oriented
[Paz, Petrank & Blackburn 2005]

Divide objetos em geraes


Ocupam tamanho varivel do heap Sempre coleta heap inteiro

Busca reduzir pausas com concorrncia Implementao recomendada usa


Algoritmo de rastreamento (cpia) na gerao jovem (da mesma forma que implementaes tpicas do Generational GC) Algoritmo de contagem de referncias (CC) na gerao antiga

Inicialmente gerao jovem ocupa todo o espao


Alta eficincia (demora ocorrncia de primeira coleta)

Gerao antiga cresce com coletas


Pequena gerao antiga com mais objetos ativos que mortos e pouca atividade permite eficincia mxima do algoritmo CC
64

Generational vs. Age-oriented


Generational
Gerao jovem menor que gerao velha Faz coletas freqentes apenas na gerao jovem Faz coleta do heap inteiro, com algoritmo diferente, aps vrias coletas da gerao jovem

Age-oriented
Gerao jovem maior que gerao velha Sempre coleta o heap inteiro, usando algoritmos diferentes para cada gerao

65

Generational vs. Age-oriented


Generational
Velha Velha Velha Velha Velha

Jovem

Jovem

Jovem

Jovem

Jovem

tempo
Velha Velha Velha Velha

Age-Oriented

Jovem

Jovem

Jovem Young

Jovem Young

Jovem

Fonte: [Paz, Petrank & Blackburn 2005]

66

Consideraes
Vantagens
Maior gerao jovem possvel (coletas raras e menos pausas) Cada gerao tratada diferentemente (eficincia)

Desvantagens
Pausas sero longas na gerao jovem se no for usado um coletor concorrente (usando algoritmo de cpia concorrente) Coleta na gerao antiga ser ineficiente se for usado algoritmo de rastreamento (ideal usar contagem de referncias)

Suporte
Experimental (objeto de pesquisa atual) No suportado por nenhuma JVM HotSpot no momento Implementao em Jikes RVM obteve performance melhor que implementao HotSpot
67

4. Coleta de lixo em paralelo


H trs* estratgias de coleta de lixo quanto execuo paralela do coletor de lixo
Coleta serial: o coletor ocorre em srie com a aplicao, parando o mundo (stop-the-world) quando precisar liberar memria Coleta incremental (on-the-fly): o coletor executa em paralelo realizando coletas pequenas (no necessariamente completas) sempre que possvel, usando vrios threads visando menos (ou zero) pausas Coleta concorrente: o coletor realiza suas principais tarefas em um processador ou thread exclusivo (pode parar todos os threads para marcar, se necessrio) visando maior eficincia
* HotSpot divide em quatro, devido a diferentes estratgias para geraes individuais
68

Parando o mundo
Os algoritmos seriais de rastreamento precisam parar todos os threads para realizar coleta de memria
Rastreamento: qualquer estratgia que use MC, MS ou CA

Por que preciso parar o mundo?


Enquanto o thread de rastreamento varre o heap procura de objetos alcanveis, alguns dos j marcados poderiam tornar-se inalcanveis se o programa principal no fosse interrompido

Por que no usar os algoritmos de contagem de referncia (RC e CC) ?


uma soluo. Podem operar em paralelo sem parar tudo Ainda esto pouco maduros (so foco atual de pesquisas) Atualmente so usados apenas experimentalmente; possvel que venham a ser usados no futuro nas JVMs HotSpot
69

Rastreamento incremental
Os algoritmos de rastreamento mostrados no podem ser usados em sistemas de tempo real pois introduzem a qualquer momento pausas de durao imprevisvel
Sistemas de tempo real requerem tempos de resposta previsveis e determinsticos

Para usar coleta de lixo em sistemas de tempo real preciso eliminar totalmente as pausas! Soluo: buscar algoritmos capazes de executar em paralelo e no interferir na execuo da aplicao
Solues baseadas em contagem de referncias RC/CC Verses incrementais de algoritmos de cpia e MS/MC Rastreamento baseado em marcao tricolor (TCM)
70

Marcao tricolor (TCM)


[Dijkstra 76]

Um algoritmo de rastreamento que atribui um entre trs estados (cores) a um n do grafo de objetos
Principal algoritmo de coleta de lixo incremental

Cores e tipos de n
Branco: n e seus filhos (objetos ao qual se refere) ainda no alcanados (no foram marcados) Cinza: n j foi alcanado (e marcado), mas seus filhos ainda no foram Preto: n e seus filhos j foram alcanados e marcados

No final da fase de marcao do algoritmo, os ns que ainda esto marcados com a cor branca podem ser coletados com segurana
* Tri-Colour Marking
71

TCM: funcionamento
1. Inicializao
Inicialmente todos os ns so brancos (inalcanveis) O conjunto de referncias raiz marcada cinza

2. Rastreamento e marcao 1 (cinza):


Quando o coletor encontra um caminho entre um n cinza e um n branco, pinta o n branco de cinza Prossegue recursivamente at encontrar todos os objetos alcanveis a partir dele, pintando cada um de cinza

3. Rastreamento e marcao 2 (preto):


Quando todos os caminhos de um n cinza levam a ns cinza ou pretos, o n pintado de preto

4. Reciclagem e liberao de memria:


Quando no houver mais ns cinzas, todos os ns alcanveis foram encontrados. Os ns brancos restantes so reciclados.
72

TCM (1): inicializao


Todos os ns inicialmente marcados como brancos referncias raiz em cinza Heap Conjunto raiz

a b

c d e
73

TCM (2): marcao cinza


No tem referncias brancas Conjunto raiz Ainda tem referncias brancas Heap

a b

c d e
74

TCM (3): marcao preta


No tm mais referncias brancas Conjunto raiz Ainda tem referncias brancas Heap

a b

c d e
75

TCM (4): marcaes recursivas


Brancos que sobraram sero coletados pois so inaccessveis Conjunto raiz Heap

a b

c d e
76

TCM (5): reciclagem dos brancos


Heap final contm apenas objetos ativos Conjunto raiz Heap

a b

c d e
77

Invariante tricolor
Um objeto preto nunca poder ter referncias para objetos brancos
Quando aplicao gravar uma referncia entre um n preto e um branco, o coletor precisar pintar ou o n pai ou o n filho de cinza Quando a aplicao quiser ler um n branco, ele tem que ser pintado de cinza

Para realizar isto, o sistema precisa


Rastrear gravaes em ns pretos (usando uma barreira de gravao write barrier) Rastrear leituras em ns brancos (usando uma barreira de leitura read barrier)
78

TCM: consideraes
Vantagens
Possibilidade de uso incremental e eliminao de pausas na coleta de lixo (permite uso em aplicaes de tempo real) Melhor performance aparente

Desvantagens
Sincronizao complexa entre a aplicao e o coletor de lixo Barreiras podem dificultar a implementao em diferentes sistemas e diminuir a eficincia (menos throughput)

Suporte em JVMs
Atualmente, em mquinas virtuais Java usado apenas experimentalmente (HotSpot JVM no usa este algoritmo; usa verses incrementais de outros algoritmos de rastreamento)
79

Train algorithm
[Hudson & Moss 92]

Algoritmo incremental usado para coleta de gerao estvel em sistemas que usam Generational GC Divide a memria em blocos de tamanho fixo
Metfora: blocos menores so vages e colees de tamanho arbitrrio desses blocos so trens Trens e vages so ordenados por idade; os mais antigos so coletados enquanto novos trens e vages se formam Entre a formao e coleta, atualiza-se referncias entre objetos Muito ineficiente com objetos populares (objetos que tm muitas referncias) que podem ocorrer com freqncia nas geraes estveis; verses eficientes podem ter pausas pequenas

O Train algorithm usado na JVM HotSpot


Mas parou de ser mantido a partir da verso 1.4.2
80

Snapshots e Sliding Views


Coletores paralelos precisam trabalhar com heaps que mudam durante a coleta
Enquanto um thread marca os objetos outro thread pode estar liberando referncias (gerando lixo) preciso trabalhar com modelos estticos do heap (snapshots ou sliding views) e coletar de forma incremental

Snapshots (concurrent GC)


Precisa parar todos os threads para obter um modelo do heap em determinado momento

Snapshots simultneos

Sliding views (on-the-fly GC)


Pra um thread de cada vez, em tempos desencontrados para obter a viso do heap (sem pausa na aplicao)

Pausa na aplicao

Sliding views

Tempo GC

Tempo Aplicao

81

On-the-fly GC (incremental)
rea de pesquisa emergente
Contagem de referncia (CC) torna-se mais popular com heaps grandes (j que pesquisa objetos vivos) e sistemas paralelos (onde suas desvantagens diminuem)

Vrios artigos recentes


RC (CC) on-the-fly com sliding views [Levanoni-Petrank 01] Mark Sweep on-the-fly com sliding views [Azatchi-Levanoni 03] On-the-fly cycle collection [Paz et al 2003] On-the-fly generational collector [Domani et al 2000]

Implementaes
Todas experimentais (Jikes RVM) Podem aparecer em verses futuras de VMs comerciais de Java (e tambm de C#)
82

Concurrent GC (rastreamento)
Algoritmo de cpia concorrente
Cpia incremental ([Baker 78]): ponteiros so lidos apenas em to_space; se ponteiro estiver em from_space na leitura, primeiro copia objeto depois obtm ponteiro Algoritmo similar usado pela HotSpot JVM para coletar paralelamente a gerao jovem (mais sobre isto na seo seguinte). Veja [Flood et al 2001].

Mark-sweep concorrente
Usado pelo HotSpot JVM para coletar paralelamente a gerao antiga (mais na seo seguinte) [Printezis 00] Causa fragmentao (no compacta) Causa pausa pequena para obter snapshot (pra todos os threads ao mesmo tempo) Verso com compactao em desenvolvimento [Flood et al 01]
83

Concluses
Existem muitas estratgias de coleta de lixo
H muito, muito mais do que foi exposto aqui

Embora o programador Java no tenha a opo de escolher qual usar, as JVMs podem permitir essa escolha e configurao Muito pode mudar nas prximas verses das JVMs existentes atualmente
H muitas estratgias experimentais que podero ser usadas em verses futuras, em diferentes plataformas H estratgias antigas caindo em desuso

Conhecer o funcionamento dos principais algoritmos ajudar a configurar e ajustar a performance da JVM em diferentes tipos de aplicaes
84

Referncias: algoritmos (artigos, 1)


[Collins 60] G. Collins. A Method for Overlapping and Erasure of Lists, IBM, CACM, 1960. Algoritmo de contagem de referncias. [McCarthy 60] J. McCarthy. Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I, MIT, CACM, 1960. Artigo original do Mark-Sweep algorithm (em Lisp). [Edwards] D.J. Edwards. Lisp II Garbage Collector. MIT. AI Memo 19. ftp://publications.ai.mit.edu/ai-publications/0-499/AIM-019.ps. Mark-Compact. [Cheney 70] C. J. Cheney. A Nonrecursive List Compacting Algorithm. CACM, Nov 1970. Artigo original do copying algorithm. [Baker 78] H. G. Baker. List processing in real time on a serial computer. CACM, Apr 1978. Uma verso concorrente do copying algorithm. [Lieberman-Hewitt 83] H. Lieberman, C. Hewitt. A Real Time Garbage Collector Based on the Lifetimes of Objects. CACM, June 1983. Artigo principal do Generational GC. [Dijkstra 76] E. W. Dijkstra, L. Lamport, et al. On-the-fly Garbage Collection: An Exercise in Cooperation. Lecture Notes in Computer Science, Vol. 46. 1976. Tri-color marking (citado em [Jones & Lins 95]). [Ungar 84] David Ungar. Generation Scavenging: A Non-disruptlve High Performance Storage Reclamation Algorithm. ACM, 1984. Um dos artigos do Generational GC. A maioria dos artigos pode ser obtido via ACM Portal (www.acm.org), CiteSeer (http://citeseer.ist.psu.edu/), sites da Sun, MIT ou IBM, ou localizados via Google

85

Referncias: algoritmos (artigos, 2)


[Hudson & Moss 92] R. Hudson, J.E.B. Moss. Incremental Collection of Mature Objects, ACM/IWMM, Sep 1992. Artigo do Train algorithm. [Domani 00] T. Domani et. al. A Generational On-The-Fly Garbage Collector for Java, IBM, 2000. [Printezis 00] Tony Printezis and David Detlefs. A Generational Mostly-concurrent Garbage Collector, 2000. Algoritmo usado no HotSpot. [Flood et al 02] Christine Flood et al. Parallel Garbage Collection for Shared Memory Multiprocessors. Sun Microsystems. Usenix, 2001. Algoritmos usados no HotSpot. [Bacon-Rajan 01] D. Bacon, V. T. Rajan. Concurrent Cycle Collection in Reference Counted Systems. IBM, 2001. [Levanoni-Petrank 01] Y. Levanoni, E. Petrank. An On-the-fly Reference Counting Garbage Collector for Java, IBM, 2001. [Azatchi 03] H. Azatchi et al. An On-the-Fly Mark and Sweep Garbage Collector Based on Sliding Views. OOPSLA 03, ACM, 2003. [Paz 05] H. Paz et al. Efficient On-the-Fly Cycle Collection. IBM (Haifa), 2005. [Paz-Petrank-Blackburn 05] H. Paz, E. Petrank, S. Blackburn. Age-Oriented Concurrent Garbage Collection, 2005.

86

Referncias: outros tpicos


Gerncia de memria
[Memory] The Memory Management Reference. http://www.memorymanagement.org/. Vrias referncias e textos sobre gerncie de memria em geral.

Mquina virtual da Sun


[JVMS] T. Lindholm, F. Yellin. The Java Virtual Machine Specification, second edition, Sun Microsystems, 1999. Formato de memria, pilha, heap, registradores na JVM. [Sun 05] Sun Microsystems. Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine. 2005. Generational GC e estratgias paralelas no HotSpot. [HotSpot] Sun Microsystems. The Java HotSpot Virtual Machine, v1.4.1, Technical White Paper. Sept. 2002. Algoritmos usados no HotSpot. [Printezis 05] Tony Printezis. Garbage Collection in the Java HotSpot Virtual Machine. http://www.devx.com/Java/Article/21977, DevX, 2005.

Livros
[Jones & Lins 96] R. Jones, R.Lins. Garbage Collection: Algorithms for Automatic Dynamic Memory Management. Wiley 1996. Vrias estratgias de GC explicadas.

Simulaes
[Venners] Bill Venners, Inside the Virtual Machine. Applet Heap of Fish: http://www.artima.com/insidejvm/applets/HeapOfFish.html

2005, Helder da Rocha www.argonavis.com.br

87

Você também pode gostar