Gerência de Memória Em Java
-
Upload
fernandojribeiro -
Category
Documents
-
view
24 -
download
0
Transcript of Gerência de Memória Em Java
-
Java
Tpicosselecionados
deprogramao
em Gerncia de Memria em Java
Parte I: Arquitetura da JVM e algoritmos de coleta de lixo
1
Helder da RochaSetembro 2005
-
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
4
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 JVM2. Coleta de lixo: algoritmos elementares3. Coleta de lixo: algoritmos combinados (estratgias)4. Coleta de lixo em paralelo (coletores no-seriais)
-
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
5
HelloWorld.class
javaClass
Loader
no
sim BytecodeVerifier
InterpretadorTradutor JIT
HARDWARETradutor JIT: Just-In-Time Compiler.
Gera cdigo nativo a partir de bytecodes
Tempo de execuo
cdigo nativo
Classeremota?
F4 D9 00 03 0A B2 FE FF FF 09 02 01 01 2E 2F 30 62 84 3D 29 3A C1 00 00
class HelloWorld {public static void main(String[] args) {
System.out.println("Hello, world!");}
}
javac
-
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
Instrues (RX)
Dados globais (RW)
Pilha
Heap
PC
SP
O diagrama ao lado apenas ummodelo 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
R
e
g
i
s
t
r
a
d
o
r
e
s
8
* 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.)
PC = Program counterSP = Stack pointer
-
Anatomia da JVM: reas de dados
9
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
Algumas reas esto associadas a threads (privativas) So criadas/alocadas quando
um thread novo criado So destrudas/liberadas
quando o thread termina
Outras reas esto ligadas mquina virtual (compartilhadas) Criadas quando a JVM iniciada Destrudas quando a JVM termina
Heap (compartilhado)
Method area
Pool de constantes
Cdigo compilado
Pilhas (uma para cada thread)
Variveis locais
Quadro (um por mtodo)Registrador PC (um por thread)
Pilha de operandos
Quadro
...
...
-
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 A memria usada pela pilha
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)
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.
2
5
t
h
i
s
0
3
4
9
F
0
t
h
i
s
.
9
9
9
9
e
2
3
t
h
i
s
0
11
-
Quadros de pilha (frames)
12
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
Cada quadro possui Um array de variveis locais Uma pilha de operandos Referncia ao pool de constantes de runtime da classe corrente.
25
this
0
349F
34A3
this
.999e23
this
0
-
Quadros correntes e chamadas
13
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
Quando o mtodo corrente m1, associado ao quadro q1, chama outro mtodo m2 Um novo quadro q2 criado (que
passa a ser o quadro corrente) Quando o mtodo m2 retornar, o
quadro q2 retorna o resultado da sua chamada (se houver) ao quadro q1
O quadro q2 descartado e q1 volta a ser o quadro corrente
7
349F this
.7e2
this
0
m1()
m2()
7
490.0 this
.7e2
this
0
m1()
m2()
1234
-
Variveis locais
14
Cada frame possui um vetor de variveis contendoas variveis locais do seu mtodo associado. Variveis de at 32 bits ocupam um lugar no array Variveis de 64 bits ocupam dois lugares consecutivos
So usadas para passar parmetros durante a chamada de mtodos
Variveis locais so acessadas pelo seu ndice (a partir de 0) 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
Variveislocais de mtodoesttico
0
1
2
3
args
h
sumVariveislocais de
mtodo de instncia
0
1
2
this
ix
main(args) {Hello h=...int sum=...for(int i= ...
y
soma(x,y)
-
Pilha de operandos Cada quadro contm uma pilha LIFO
conhecida como Pilha de Operandos Quando o quadro criado, a pilha vazia 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
0xFF
7
0
(7) astore_1
(14) istore_2
(16) istore_3
15
-
Cdigo Java e instrues de pilha
16
2: public class HelloWorld {3: public HelloWorld() {}4: public int sum(int x, int y) {5: return (x + y);6: }7: public static void main(String[] a) {
8: HelloWorld h = new HelloWorld();
9: int sum = h.sum(3, 4);
10: for (int i = 0; i < sum; i++ ) {
11: System.out.println(i);15: }13: }14:}
0: iload_11: iload_22: iadd3: ireturn
0: new #2;3: dup4: invokespecial #3;7: astore_18: aload_19: iconst_310: iconst_411: invokevirtual #4;14: istore_215: iconst_016: istore_317: iload_318: iload_219: if_icmpge 3522: getstatic #5;25: iload_326: invokevirtual #6;29: iinc 3, 132: goto 1735: return
a
h
sum
0
1
2
3
Arrays de variveis
locais
this
x
y
0
1
2
i
Instrues de mquina
PC
&h
7
0
(7)
(14)
(16)
Pilha de operandos
-
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
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
Method area
Pool de constantes
Cdigo compilado
Resto do heap
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 classejavap [-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)
20* Perl, Python, Rubi, Basic, LISP, Algol, Dylan, Prolog, PostScript, Scheme, Simula, Smalltalk, ML eModula-3 (na maior parte suporta controle manual em alguns mdulos)
-
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
21* Novos algoritmos so suportados a cada nova verso
-
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
25
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
-
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 ouobjeto que a continha foi coletado): contagem--
Se contagem cair a zero, o objeto considerado lixo e pode ser coletado a qualquer momento
26*RC = Reference Counting
-
Contagem de referncias (1) Cada seta que chega em um objeto contada como uma referncia
para ele (independente de onde tenha vindo)
HeapConjunto raiz
27
3 1
1 1
1
3 1
1
1
1
1
0
1
1 1
1
2 0
2
1
1
1 1
1
1
1
a
b
c
d
e
-
Contagem de referncias (2) Referncias circulares impedem que contagem caia
para zero quando deveria. Memory leak! Objetos inalcanveis que
no sero coletados!HeapConjunto raiz
28
1 1
1 1
1
2 1
1
1
1
1
0
0
1 1
1
1 0
1
0
0
0 0
0
2
1
b = c;
e saiu de escopo {...}
a = null;a
b
c
d
e
-
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 caipara valor diferente de zero
Obs2: Em ciclos-lixo, toda a contagem devido a ponteiros internos
Portanto, objetos que tem contagem decrementada paravalores diferente de zero so candidatos (obs1)
Algoritmo realiza trs passos locais nos candidatos1. 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 alcanveis3. Collect: coleta os ns cuja contagem for zero
30
-
CC: identifica candidatos remoo
31Candidato: reduziu de 3 para 2
Candidato: reduziu de 2 para 1
1 1
1 1
1
2 1
1
1
1
1
0
0
1 1
1
1 0
1
0
0
0 0
0
Conjunto raiz Heap
2
1
b = c;
e saiu de escopo {...}
a = null;a
b
c
d
e
Candidatos: objetos cuja contagem foi decrementada para valor diferente de zero
-
CC: passo 1 - mark Navega nas referncias a partir do candidato e conta
apenas as referncias externas ao ciclo contagem de referncias externas
32
0 0
0 0
0
1 0
0
0
0
0
0
0
1 1
1
1 0
1
0
0
0 0
0
Conjunto raiz Heap
2
1
b = c;
e saiu de escopo {...}
a = null;a
b
c
d
e
Uma referncia externa
-
CC: passo 2 - scan Restaura contagem dos ns que forem acessveis
atravs das referncias externasinaccessveis
33
0 0
0 0
0
2 1
1
1
1
1
0
0
1 1
1
1 0
1
0
0
0 0
0
Conjunto raiz Heap
2
1
b = c;
e saiu de escopo {...}
a = null;a
b
c
d
e
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
HeapConjunto raiz
35
a
b
x
x x
x
x
x x x
x
x
x
x
x
c
d
e
* tracing
-
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 seucriador [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 coletaa
bReferncias do conjunto
raiz
37Heap
-
MS: fase de marcao: Mark
X
X
XX
X
Xa
b
Objetos que o garbage collectorno conseguiu alcanar
38Heap
-
MS: fase da faxina: Sweepa
b
Objetos que no foram marcados foram varridos do heap!
39Heap
-
MS: alocao de novos objetosa
bc
H fragmentao no heap! A utilizao ineficiente!
Esta a primeira parte do heap onde o objeto cabe
40Heap
-
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
-
42
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
-
MS: fase de marcao: Mark
X
X
XX
X
Xa
b
Objetos que o garbage collectorno conseguiu alcanar
Igual a Mark-Sweep
43Heap
-
MC: fase de compactao: Compacta
b
Objetos marcados so movidos para os espaos vazios do incio do heapA compactao requer
execuo de algoritmo adicional (mais
complexo que MS)
44Heap
-
MC: alocao de novos objetosa
bc
Heap de objetos contguos: mais
eficiente!
45Heap
-
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 CGsconcorrentes (multiprocessadores)
Veja exemplo grfico interativo de algoritmo Mark-Sweep-Compact (applet Java Heap of Fish) http://www.artima.com/insidejvm/applets/HeapOfFish.html (Bill
Venners, do livro Inside the Virtual Machine) [Venners]
46
-
47
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 from2. Quando o coletor de lixo executado, ele navega
pela corrente de referncias e copia os objetosalcanveis para a rea to
3. Quando a cpia completada, os espaos to e from trocam de papel
-
CA: antes da coletaa
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!
48Heap origem: From Heap destino: To
-
CA: copia objetos alcanveisa
b
Objetos que forem alcanveis a partir do conjunto raiz so copiados medida em que so encontrados
Referncias so atualizadas
49Heap origem: From Heap destino: To
-
CA: esvazia e troca de papela
50
b
Toda a rea de memria do heap origem liberada
Troca de ppis: a rea do heap que era destinotorna-se origem e a origem torna-se destino
Alocao passa a ocorrer em outra rea do heap
Heap destino: To Heap origem: From
-
AC: alocao de novos objetosa
51
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
-
AC: consideraes Vantagens
Cpia rpida, principalmente se a quantidade de objetosalcanveis 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 metadedo 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)
Contagem de referncias
Coleo de ciclos
Mark-sweep
Mark-compact
Copying
permit
e uso
total d
o heap
usado
no Ho
tSpot J
VM**
fragm
enta o
heap
coleta
todo o
lixo
precis
a para
r a ap
licao
*
precis
a varr
er hea
p inteir
o
sim
sim
sim
no
sim
sim
sim
no
no
sim
no
sim
sim
sim
no
sim
sim
sim
sim
no
no
sim
sim
no
no
no
sim
sim
sim
no
Em vermelho, geralmente um critrio negativo
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 alocadosColetas menores Coletas maiores (Full GC)
b
y
t
e
s
s
o
b
r
e
v
i
v
e
n
t
e
s
56
bytes alocadosFonte: Sun [Sun 05]
-
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
61
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
-
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
62
a
a
b d
c
b
c
e
Geraojovem
Geraoestvel
Refernciasraiz
Primeira coleta da gerao jovem
Segunda coleta da gerao jovem
Novasalocaes
Objetossobreviventes
1 32
-
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 memriaonde 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
Velha Velha Velha Velha VelhaGenerational
66
Velha
JovemJovem
Velha
JovemYoung
Young
Age-Oriented
Velha
Jovem
Velha
Jovem
JovemJovem Jovem Jovem Jovem
tempo
Fonte: [Paz, Petrank & Blackburn 2005]
-
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
68* HotSpot divide em quatro, devido a diferentes estratgias para geraes individuais
-
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
71* Tri-Colour Marking
-
TCM: funcionamento1. 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
HeapConjunto raiz
73
a
b
c
d
e
-
TCM (2): marcao cinza
74
Conjunto raiz Heap
No tem referncias brancas
Ainda tem referncias brancas
a
b
c
d
e
-
TCM (3): marcao preta
75
Conjunto raiz
No tm mais referncias brancas
Ainda tem referncias brancas
Heap
a
b
c
d
e
-
TCM (4): marcaes recursivasBrancos que sobraram sero
coletados pois so inaccessveisHeapConjunto raiz
76
a
b
c
d
e
-
TCM (5): reciclagem dos brancosHeap final contm apenas
objetos ativosHeapConjunto raiz
77
a
b
c
d
e
-
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
81
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 heapem determinado momento
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)
Snapshots simultneos
Pausa na aplicao
Sliding views
Tempo GC Tempo Aplicao
-
On-the-fly GC (incremental) rea de pesquisa emergente
Contagem de referncia (CC) torna-se mais popular com heapsgrandes (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 JVMsexistentes 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-Sweepalgorithm (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 onthe 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 inCooperation. 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.
85A 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
-
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 AutomaticDynamic 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
87
2005, Helder da Rochawww.argonavis.com.br
Gerncia de Memria em JavaParte I: Arquitetura da JVM e algoritmos de coleta de lixoPor que gerenciar memria?Gerencia de memria? Em Java?Assuntos abordados1. Anatomia da JVMJava esconde detalhes da memriaA pilha, o heap e a JVMSegmentao de memria virtual:esquema lgico de baixo nvelAnatomia da JVM: reas de dadosO registrador PCPilhas da JVMQuadros de pilha (frames)Quadros correntes e chamadasVariveis locaisPilha de operandosCdigo Java e instrues de pilhaO heaprea de mtodosFerramenta javap2. Algoritmos de coleta de lixoColeta de lixoDesafios da coleta de lixoAlgoritmos para coleta de lixoEstratgias de coleta de lixoMetas ajustveisContagem de referncias (RC*)Contagem de referncias (1)Contagem de referncias (2)RC: consideraesColeta de ciclos (CC)CC: identifica candidatos remooCC: passo 1 - markCC: passo 2 - scanCC: consideraesAlgoritmos de rastreamento*Algoritmo Mark and Sweep (MS)MS: o heap antes da coletaMS: fase de marcao: MarkMS: fase da faxina: SweepMS: alocao de novos objetosMS: consideraesAlgoritmo Mark-Compact (MC)MS: fase de marcao: MarkMC: fase de compactao: CompactMC: alocao de novos objetosMC: consideraesAlgoritmo de cpia: CACA: antes da coletaCA: copia objetos alcanveisCA: esvazia e troca de papelAC: alocao de novos objetosAC: consideraesComparao (em coletor serial)3. Estratgias de coleta de lixoVida dos objetosMortalidade infantil dos objetosGenerational GCFundamentos do Generational GCPonteiros entre geraesGenerational GC: algortmosFuncionamento: generational GCFuncionamento ilustradoConsideraesAge-orientedGenerational vs. Age-orientedGenerational vs. Age-orientedConsideraes4. Coleta de lixo em paraleloParando o mundoRastreamento incrementalMarcao tricolor (TCM)TCM: funcionamentoTCM (1): inicializaoTCM (2): marcao cinzaTCM (3): marcao pretaTCM (4): marcaes recursivasTCM (5): reciclagem dos brancosInvariante tricolorTCM: consideraesTrain algorithmSnapshots e Sliding ViewsOn-the-fly GC (incremental)Concurrent GC (rastreamento)ConclusesReferncias: algoritmos (artigos, 1)Referncias: algoritmos (artigos, 2)Referncias: outros tpicos