Escolar Documentos
Profissional Documentos
Cultura Documentos
Java utiliza alocao dinmica (heap) para objetos e alocao linear (pilha) para procedimentos seqenciais
Mas todo o gerenciamento feito automaticamente
2
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
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
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
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
Pilhas (uma para cada thread) Quadro (um por mtodo) Variveis locais
...
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
Pilhas da JVM
Cada thread criado com uma pilha associada
usada para guardar variveis locais e resultados parciais
.9999e23
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
this
this
usado para
guardar resultados parciais e dados realizar ligao dinmica retornar valores de mtodos despachar excees
this 0 349F this 25 .999e23 34A3 this
Um array de variveis locais 0 Uma pilha de operandos Referncia ao pool de constantes de runtime da classe corrente.
12
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
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
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
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:
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
0 1 2 3
8:
a h sum i
9:
10:
Pilha de operandos
(7) (14) (16)
&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
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
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
Opo l imprime tabela de variveis locais Sem opes, mostra a interface da classe
19
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
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
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
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
Conjunto raiz
a b
c d e
Conjunto raiz
a = null;
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
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
Heap 0 0 2 1 0 0 1 1 1 0 1 1 0 0
a b
1 1
1 1 1
b = c;
c d e
e saiu de
escopo {...}
1 1
1 1
31
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
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 {...}
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)
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
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
Heap
37
X X X
Heap
38
Heap
39
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
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
X X
Igual a Mark-Sweep
Heap
43
A compactao requer execuo de algoritmo adicional (mais complexo que MS) Heap
44
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
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
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
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
no no sim sim no
** at verso 5.0
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
Concluso
Pode-se tornar mais eficiente o coletor de lixo se analisando os objetos jovens com mais freqncia que os objetos mais velhos
55
bytes sobreviventes
bytes alocados
56
Generational GC
[Lieberman-Hewitt 83] e [Ungar 84]
As geraes mais velhas devem ser maiores que as geraes mais novas
Tipicamente so exponencialmente maiores
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
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)
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
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
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]
Age-oriented
Gerao jovem maior que gerao velha Sempre coleta o heap inteiro, usando algoritmos diferentes para cada gerao
65
Jovem
Jovem
Jovem
Jovem
Jovem
tempo
Velha Velha Velha Velha
Age-Oriented
Jovem
Jovem
Jovem Young
Jovem Young
Jovem
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
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
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
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
a b
c d e
73
a b
c d e
74
a b
c d e
75
a b
c d e
76
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
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
Snapshots simultneos
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)
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
85
86
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
87