SlideShare ist ein Scribd-Unternehmen logo
1 von 23
Downloaden Sie, um offline zu lesen
JVM 
Garbage 
Collectors
About Me 
Fabiano V. Santos 
@gmcoringa 
Engenheiro de Software na Elo7 
Time de buscas: Greyjoy
HotSpot VM Geracional 
• Modelo geracional, aka “hipótese geracional fraca” 
• Objetos mais alocados tem um curto peíodo de vida 
• Poucas referências de objetos velhos para novos existem 
Youg Generation 
• Onde são alocados novos objetos; 
• Coletas frequentes; 
• Coletas pequenas; 
Old Generation 
• Objetos de longa duração 
• Poucas coletas 
• Crescimento lento
Card Table 
• Usada para identificar objetos em uso na young generation sem a 
necessidade de verificar a old generation 
• Objetos que possuem referência a old generation são marcados como 
“sujos” 
• Durante “minor collection” objetos sujos são verficados para descobrir 
pontenciais referencias da old generation para young generation
Collection Roots 
Alguns objetos especiais são sempre alcançaveis, e estes formam o que é 
chamado de “Garbage Collection Roots”. 
Existem quatro tipos de GC Roots: 
• Variáveis locais 
• Java threads ativas 
• Variáveis estaticas 
• Referências JNI 
Objetos não alcançáveis 
Lixo 
Objetos alcançáveis 
GC Roots
Young Generation 
• Dividida em três areas: 
• Eden: onde novos objetos são alocados 
• Duas Survivors: objetos que sobreviveram a pelo 
menos uma coleta. 
Young Generation Eden 
From survivor To survivor 
Sem Uso 
Old Generation 
Antes do Minor GC 
Young Generation 
Vazio 
To survivor From survivor 
Sem Uso 
Old Generation 
Depois do Minor GC 
Eden
Alocação de Memória 
• Bump the pointer 
• Objetos são alocados no topo 
• Young generation usa “copying garbage collector”, o que sempre deixa a Eden 
vazia 
• TLABs (Thread-Local Allocation Buffers) 
• Cada thread possui um buffer, que é um pedaço da Eden 
• Requisições a novos TLABs não são frequentes 
• Garante alocação rápida de objetos 
• Multithreaded 
• Survivor Full 
• Objetos que causem overflow são alocados na old generation (“premature 
promotion”) 
• Se durante o overflow a old generation ficar cheia, um Full GC é executado, aka: 
“promotion failure”
Serial GC 
• Coletas na young e old através de “stop-the-world” 
• Usa apenas um processador virtual 
Old Generation GC 
Free 
Antes da Compactação Após a Compactação 
Usos 
• Eficiente para aplicação com menos de 100 MB Java Heap 
• Ambientes com alto numero de JVMs
Throughput Collectors 
Parallel GC 
• Funciona de forma semelhante ao Serial GC, porém multi-thread 
• Somente Young Generation 
Parallel Old GC 
• Multi-thread Old Generation 
• Automaticamente habilita Parallel GC 
Usos 
• Aplicações que necessitem de alto throughput 
• Multiplos processadores 
• Exemplos: processamento batch, queues
Concurrent Mark-Sweep (CMS) 
Young Generation 
• Semelhante ao Parallel GC 
Old Generation 
• Roda de forma concorrente, com o objetivo de manter espaço livre suficiente 
• Possui apenas duas pequenas pausas (Initial Mark e Remark) 
• Menor throughput 
• Coletas concorrentes 
• Faz uso de free lists para alocação de objetos na old generation 
• Coleta se inicia quando ocupação alcança um certo threashold 
(CMSInitiatingOccupancyFraction)
CMS: funcionamento 
• Initial Mark: possui uma pequena pausa e marca objetos alcançaveis fora da old 
generation (GC Roots) 
• Concurrent mark: marca todos os objetos “vivos”. Não há garantias de que todos 
os objetos “vivos” serão marcados. 
• Pre-cleaning: verifica objetos que foram modificados durante as fases anteriores. 
• Remark: possui uma pequena pausa, verifica objetos modificados e garante 
que todos os objetos vivos foram marcados. 
• Concurrent sweep: varredura, remove objetos não mais utilizados.
CMS: Prós e contras 
● Redução de throuput 
● Requer maior heap 
● Maior consumo de CPU 
● Fragmentação 
● Tempo de resposta rápida, ex: 
applicações web 
● Reduz ou anula Full GCs 
● Menor latência
Garbage First GC (aka G1) 
• Substituo de longo prazo do CMS 
• Paralelo 
• Concorrente 
• Compactação incremental 
• Usa layout diferente na heap 
E O O L O E L 
L 
O 
L E S S O 
L O O L O 
O S E E L O 
S L O L O L 
H 
H 
Eden 
E 
S 
O 
L 
H 
Survivor 
Old Generation 
Sem Uso 
Humongous
G1 Minor Collection 
E O O L O E L 
L 
O 
L E S S O 
L O O L O 
O S E E L O 
S L O L O L 
H 
H 
E O O 
L 
O 
S 
L 
Antes do minor GC Depois do minor GC 
S 
O 
L E 
S 
O 
O O L O 
O E E L O 
L O L O 
H 
H 
L 
L S 
L S
G1: Funcionamento 
• Coleta concorrente iniciada após ocupação alcançar um certo threshold (Mixed 
Collection, equivalente a coleta da old generation) 
• Coleta em areas com menor ocupação, ou seja, menor número de objetos 
“vivos” 
• Até 8 Mixed Collections, iniciado após uma coleta concorrente 
• Estruturas de dados G1 
• RSet (Remembered Set): objetos vivos em uma região 
• CSet (Collection Set): regiões que serão coletados 
• Possui como objetivo pausas de 200ms (default) 
• 2k Regiões, tamanhos variam de 1MB a 32MB
G1: Fases 
• Minor GC: possui uma pequena pausa, coleta na eden e survivor 
• Coleta Concorrente 
• Initial Mark: possui uma pequena pausa, marca todos os objetos alcançaveis 
(GC Roots) e é concorrente com o minor GC 
• Root Region Scanning: procura nas regiões “Survirvor” por referencias a 
objetos na old generation 
• Concurrent Marking: marca todos os objetos vivos (young e old) 
• Remark: possui uma pequena pausa,verifica objetos que foram modificados 
durante as fases anteriores. 
• Cleanup: possui uma pequena pausa, identifica regiões livres e limpa Rset. 
• Concurrent Cleanup: Reset, limpa e devolve regiões livres para a lista de 
regiões sem uso. Single threaded.
GC Comparativo 
Serial GC Parallel GC CMS GC G1 GC 
Young GCs Serial Multi-threaded 
Multi-threaded 
Multi-threaded 
Old GCs Serial Multi-threaded 
Multi-threaded 
e 
Concorrente 
Multi-threaded 
e 
Concorrente
GC Log 
-XX:+PrintGCDetails (-verbose:gc -XX:+PrintGC) 
-XX:+PrintGCDateStamps 
-XX:+PrintGCTimeStamps 
-Xloggc:gc.log
Ferramentas 
• https://github.com/Netflix/gcviz 
• https://github.com/chewiebug/GCViewer 
• https://h20392.www2.hp.com/portal/swdepot/displayProductInfo.do?productNumbe 
r=HPJMETER 
• http://www.ibm.com/developerworks/java/jdk/tools/gcmv/ 
• https://java.net/projects/gchisto
PermGen & Metaspace 
• PermGen Java 1.7 ou anterior 
• Area para guardar meta-informações de classes 
• Java 8 movido para Metaspace 
• Coletas se iniciam quando alcançado um certo valor de alocação 
(MetaspaceSize) 
• Off heap 
• Out of memory ainda podem acontecer 
"java.lang.OutOfMemoryError: Metadata space"
História dos GC 
• Serial GC foi incluído no Java 1.3, juntamente com outro garbage colector 
chamado Train GC 
• Parallel GC e CMS incluídos no Java 1.4.2 
• Parallel Old GC incluído no Java 5 Update 6, juntamente com melhorias no 
CMS (Concurrent Marking e Sweeping) 
• Train GC removido no Java 6 
• G1 GC incluído no Java 6 Update 20
Bibliografia 
• Charlie Hunt, Binu John. Java Performance, Addison-Wesley, 2013. 
• Charlie Hunt, Monica Beckwith. Qcon New York, 2013. 
http://www.infoq.com/presentations/java-g1 
• Monica Beckwith. Garbage First Collector Tunning Article, 2013. 
http://www.oracle.com/technetwork/articles/java/g1gc-1984535.html 
• David Detlefs, Christine Flood, Steve Heller, Tony Printezis. G1 original paper, 2004. 
http://dl.acm.org/citation.cfm?id=1029879 
• Sun Microsystems. Memory Manager White paper, 2006. 
http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150 
215.pdf
Perguntas ?

Weitere ähnliche Inhalte

Ähnlich wie Java Garbage Collectors - HotSpot

Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar SorocabaRuby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar SorocabaFabio Akita
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaAdriano Teixeira de Souza
 
JVM and Tools - ESIG Academy
JVM and Tools - ESIG AcademyJVM and Tools - ESIG Academy
JVM and Tools - ESIG AcademyGleydson Lima
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordtchandy
 
Boas práticas na configuração de jobs no Kubernetes
Boas práticas na configuração de jobs no KubernetesBoas práticas na configuração de jobs no Kubernetes
Boas práticas na configuração de jobs no KubernetesGraziella Bonizi
 
Introdução Java virtual machine
Introdução Java virtual machineIntrodução Java virtual machine
Introdução Java virtual machineBruno Coan
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeStefan Teixeira
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorFelipe Hummel
 
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaFelipe Hummel
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valorKinn Julião
 
MEO Cloud - Python Lisbon Meetup
MEO Cloud - Python Lisbon MeetupMEO Cloud - Python Lisbon Meetup
MEO Cloud - Python Lisbon MeetupAndré Cruz
 
Arquitetura de Memoria do PostgreSQL
Arquitetura de Memoria do PostgreSQLArquitetura de Memoria do PostgreSQL
Arquitetura de Memoria do PostgreSQLRaul Oliveira
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoelliando dias
 
PostgreSql - Um banco de dados Open Source que figura entre os grandes
PostgreSql - Um banco de dados Open Source que figura entre os grandesPostgreSql - Um banco de dados Open Source que figura entre os grandes
PostgreSql - Um banco de dados Open Source que figura entre os grandesjoanio trade
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panosLaís Lima
 

Ähnlich wie Java Garbage Collectors - HotSpot (20)

Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar SorocabaRuby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
 
JVM and Tools - ESIG Academy
JVM and Tools - ESIG AcademyJVM and Tools - ESIG Academy
JVM and Tools - ESIG Academy
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecord
 
Boas práticas na configuração de jobs no Kubernetes
Boas práticas na configuração de jobs no KubernetesBoas práticas na configuração de jobs no Kubernetes
Boas práticas na configuração de jobs no Kubernetes
 
Introdução Java virtual machine
Introdução Java virtual machineIntrodução Java virtual machine
Introdução Java virtual machine
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitor
 
Bigdata
BigdataBigdata
Bigdata
 
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
 
Jsummit 2014
Jsummit 2014Jsummit 2014
Jsummit 2014
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 
Projeto OpenJDK [Java8]
Projeto OpenJDK [Java8]Projeto OpenJDK [Java8]
Projeto OpenJDK [Java8]
 
Por um Java mais funcional
Por um Java mais funcionalPor um Java mais funcional
Por um Java mais funcional
 
MEO Cloud - Python Lisbon Meetup
MEO Cloud - Python Lisbon MeetupMEO Cloud - Python Lisbon Meetup
MEO Cloud - Python Lisbon Meetup
 
Arquitetura de Memoria do PostgreSQL
Arquitetura de Memoria do PostgreSQLArquitetura de Memoria do PostgreSQL
Arquitetura de Memoria do PostgreSQL
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardo
 
PostgreSql - Um banco de dados Open Source que figura entre os grandes
PostgreSql - Um banco de dados Open Source que figura entre os grandesPostgreSql - Um banco de dados Open Source que figura entre os grandes
PostgreSql - Um banco de dados Open Source que figura entre os grandes
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
Gfs slides
Gfs slidesGfs slides
Gfs slides
 

Java Garbage Collectors - HotSpot

  • 2. About Me Fabiano V. Santos @gmcoringa Engenheiro de Software na Elo7 Time de buscas: Greyjoy
  • 3. HotSpot VM Geracional • Modelo geracional, aka “hipótese geracional fraca” • Objetos mais alocados tem um curto peíodo de vida • Poucas referências de objetos velhos para novos existem Youg Generation • Onde são alocados novos objetos; • Coletas frequentes; • Coletas pequenas; Old Generation • Objetos de longa duração • Poucas coletas • Crescimento lento
  • 4. Card Table • Usada para identificar objetos em uso na young generation sem a necessidade de verificar a old generation • Objetos que possuem referência a old generation são marcados como “sujos” • Durante “minor collection” objetos sujos são verficados para descobrir pontenciais referencias da old generation para young generation
  • 5. Collection Roots Alguns objetos especiais são sempre alcançaveis, e estes formam o que é chamado de “Garbage Collection Roots”. Existem quatro tipos de GC Roots: • Variáveis locais • Java threads ativas • Variáveis estaticas • Referências JNI Objetos não alcançáveis Lixo Objetos alcançáveis GC Roots
  • 6. Young Generation • Dividida em três areas: • Eden: onde novos objetos são alocados • Duas Survivors: objetos que sobreviveram a pelo menos uma coleta. Young Generation Eden From survivor To survivor Sem Uso Old Generation Antes do Minor GC Young Generation Vazio To survivor From survivor Sem Uso Old Generation Depois do Minor GC Eden
  • 7. Alocação de Memória • Bump the pointer • Objetos são alocados no topo • Young generation usa “copying garbage collector”, o que sempre deixa a Eden vazia • TLABs (Thread-Local Allocation Buffers) • Cada thread possui um buffer, que é um pedaço da Eden • Requisições a novos TLABs não são frequentes • Garante alocação rápida de objetos • Multithreaded • Survivor Full • Objetos que causem overflow são alocados na old generation (“premature promotion”) • Se durante o overflow a old generation ficar cheia, um Full GC é executado, aka: “promotion failure”
  • 8. Serial GC • Coletas na young e old através de “stop-the-world” • Usa apenas um processador virtual Old Generation GC Free Antes da Compactação Após a Compactação Usos • Eficiente para aplicação com menos de 100 MB Java Heap • Ambientes com alto numero de JVMs
  • 9. Throughput Collectors Parallel GC • Funciona de forma semelhante ao Serial GC, porém multi-thread • Somente Young Generation Parallel Old GC • Multi-thread Old Generation • Automaticamente habilita Parallel GC Usos • Aplicações que necessitem de alto throughput • Multiplos processadores • Exemplos: processamento batch, queues
  • 10. Concurrent Mark-Sweep (CMS) Young Generation • Semelhante ao Parallel GC Old Generation • Roda de forma concorrente, com o objetivo de manter espaço livre suficiente • Possui apenas duas pequenas pausas (Initial Mark e Remark) • Menor throughput • Coletas concorrentes • Faz uso de free lists para alocação de objetos na old generation • Coleta se inicia quando ocupação alcança um certo threashold (CMSInitiatingOccupancyFraction)
  • 11. CMS: funcionamento • Initial Mark: possui uma pequena pausa e marca objetos alcançaveis fora da old generation (GC Roots) • Concurrent mark: marca todos os objetos “vivos”. Não há garantias de que todos os objetos “vivos” serão marcados. • Pre-cleaning: verifica objetos que foram modificados durante as fases anteriores. • Remark: possui uma pequena pausa, verifica objetos modificados e garante que todos os objetos vivos foram marcados. • Concurrent sweep: varredura, remove objetos não mais utilizados.
  • 12. CMS: Prós e contras ● Redução de throuput ● Requer maior heap ● Maior consumo de CPU ● Fragmentação ● Tempo de resposta rápida, ex: applicações web ● Reduz ou anula Full GCs ● Menor latência
  • 13. Garbage First GC (aka G1) • Substituo de longo prazo do CMS • Paralelo • Concorrente • Compactação incremental • Usa layout diferente na heap E O O L O E L L O L E S S O L O O L O O S E E L O S L O L O L H H Eden E S O L H Survivor Old Generation Sem Uso Humongous
  • 14. G1 Minor Collection E O O L O E L L O L E S S O L O O L O O S E E L O S L O L O L H H E O O L O S L Antes do minor GC Depois do minor GC S O L E S O O O L O O E E L O L O L O H H L L S L S
  • 15. G1: Funcionamento • Coleta concorrente iniciada após ocupação alcançar um certo threshold (Mixed Collection, equivalente a coleta da old generation) • Coleta em areas com menor ocupação, ou seja, menor número de objetos “vivos” • Até 8 Mixed Collections, iniciado após uma coleta concorrente • Estruturas de dados G1 • RSet (Remembered Set): objetos vivos em uma região • CSet (Collection Set): regiões que serão coletados • Possui como objetivo pausas de 200ms (default) • 2k Regiões, tamanhos variam de 1MB a 32MB
  • 16. G1: Fases • Minor GC: possui uma pequena pausa, coleta na eden e survivor • Coleta Concorrente • Initial Mark: possui uma pequena pausa, marca todos os objetos alcançaveis (GC Roots) e é concorrente com o minor GC • Root Region Scanning: procura nas regiões “Survirvor” por referencias a objetos na old generation • Concurrent Marking: marca todos os objetos vivos (young e old) • Remark: possui uma pequena pausa,verifica objetos que foram modificados durante as fases anteriores. • Cleanup: possui uma pequena pausa, identifica regiões livres e limpa Rset. • Concurrent Cleanup: Reset, limpa e devolve regiões livres para a lista de regiões sem uso. Single threaded.
  • 17. GC Comparativo Serial GC Parallel GC CMS GC G1 GC Young GCs Serial Multi-threaded Multi-threaded Multi-threaded Old GCs Serial Multi-threaded Multi-threaded e Concorrente Multi-threaded e Concorrente
  • 18. GC Log -XX:+PrintGCDetails (-verbose:gc -XX:+PrintGC) -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:gc.log
  • 19. Ferramentas • https://github.com/Netflix/gcviz • https://github.com/chewiebug/GCViewer • https://h20392.www2.hp.com/portal/swdepot/displayProductInfo.do?productNumbe r=HPJMETER • http://www.ibm.com/developerworks/java/jdk/tools/gcmv/ • https://java.net/projects/gchisto
  • 20. PermGen & Metaspace • PermGen Java 1.7 ou anterior • Area para guardar meta-informações de classes • Java 8 movido para Metaspace • Coletas se iniciam quando alcançado um certo valor de alocação (MetaspaceSize) • Off heap • Out of memory ainda podem acontecer "java.lang.OutOfMemoryError: Metadata space"
  • 21. História dos GC • Serial GC foi incluído no Java 1.3, juntamente com outro garbage colector chamado Train GC • Parallel GC e CMS incluídos no Java 1.4.2 • Parallel Old GC incluído no Java 5 Update 6, juntamente com melhorias no CMS (Concurrent Marking e Sweeping) • Train GC removido no Java 6 • G1 GC incluído no Java 6 Update 20
  • 22. Bibliografia • Charlie Hunt, Binu John. Java Performance, Addison-Wesley, 2013. • Charlie Hunt, Monica Beckwith. Qcon New York, 2013. http://www.infoq.com/presentations/java-g1 • Monica Beckwith. Garbage First Collector Tunning Article, 2013. http://www.oracle.com/technetwork/articles/java/g1gc-1984535.html • David Detlefs, Christine Flood, Steve Heller, Tony Printezis. G1 original paper, 2004. http://dl.acm.org/citation.cfm?id=1029879 • Sun Microsystems. Memory Manager White paper, 2006. http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150 215.pdf