Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
JVM GC 
WTF?! 
Alonso Torres @alotor
Alonso Torres 
@alotor @alotor 
mobro.co/alotor
java.lang.OutOfMemoryError: unable to create new native thread 
java.lang.OutOfMemoryError: Stack overflow 
java.lang.OutO...
SUCCESS
No tengo memoria!!! 
Todo va lento!!!!!! 
El GC es ineficiente!!!!!
With CMS GC, the full collection is serial and STW, 
hence your application threads are stopped for the 
entire duration w...
Con el recolector CMS, la recolección es “serie” y 
STW, y los hilos de tu aplicación serán detenidos 
por la duración com...
JVM 
Java Virtual Machine 
GC 
Garbage Collectors 
WTF?! 
Why They Fail?!
1. Estructura de la memoria 
2. Conceptos generales de GC 
3. Tipos de recolectores de Hotspot 
4. Configuración de Hotspo...
Os presento la 
JVM
JVM PROCESS: 1.591 Gb
JVM PROCESS: 1.591 Gb 
Memoria propia de la JVM
JVM PROCESS: 1.591 Gb 
Memoria de ejecución
JVM PROCESS: 1.591 Gb 
Memoria de datos
JVM PROCESS: 1.591 Gb 
Memoria de clases
HEAP 
- Bloque de memoria que la JVM se encargará de 
gestionar 
- Almacena los datos de los objetos 
- Memoria dinámica
OCUPADA LIBRE 
Max. Heap Size
OCUPADA LIBRE 
Max. Heap Size
OCUPADA LIBRE 
Max. Heap Size
OCUPADA LIBRE
OCUPADA LIBRE
AUMENTAMOS el heap 
ó 
LIBERAMOS memoria
OCUPADA LIBRE 
Aumenta el heap 
Liberamos el heap 
OCUPADA LIBRE
¿Cómo liberamos la memoria 
que ya no necesitamos?
Garbage Collection 
1. Busca todos los objetos vivos 
2. Libera la memoria de los objetos muertos 
3. Mueve la posición de...
GC’s en OpenJDK Hotspot 
- Serial Collector 
- Parallel Collector 
- CMS Collector 
- G1
GC’s en OpenJDK Hotspot 
- Serial Collector 
- Parallel Collector 
- CMS Collector 
- G1
MALDITOS 
TÉRMINOS!!
Stop the World (STW) 
- Parada global de todos los hilos de ejecución para 
realizar recolección de basura 
- El contrario...
STW Concurrente
Paralelo 
● La ejecución se realiza en varios hilos de ejecución 
● Aprovecha sistemas con múltiples CPUs 
● Por contra pu...
Paralelo Serie
Incremental 
● El trabajo de recolección no se realiza en un único 
paso sino en varias fases o pasos 
● Por el contrario ...
Incremental Monolítico
Weak Generational Hypothesis 
- La mayoría de los objetos mueren jóvenes 
- Los objetos viejos no suelen referenciar a obj...
Generational GC 
Dos tipos de recolección: 
○ 1 espacio pequeño con muchos muertos 
○ 1 espacio grande donde casi todos vi...
Número de objetos vivos Número de objetos
TODOS 
los GC’s son generacionales
Generational heap structure 
YOUNG OLD/TENURE
Generational heap structure 
SURVIVORS 
SURVIVORS 
EDEN OLD/TENURE
Recolectamos la Young Generation 
Objetos promocionados van a supervivientes y a la 
Old Generation
La Old Generation está llena 
Necesitamos una recolección completa
Empty young and survivors. 
Free dead old-gen objects
GC’s en OpenJDK Hotspot 
● Serial Collector 
● Parallel Collector 
● CMS Collector 
● G1 (Garbage First) Collector
Serial Collector 
YOUNG GENERATION OLD GENERATION 
Serial 
Monolithic 
Stop-The-World 
Copying Mark / Sweep / Compact
Algoritmo de COPIA (Scavenge) 
- Copia los objetos vivos de una región de la 
memoria a otra 
- Libera la zona de memoria ...
Mark / Sweep / Compact (MSC) 
1. Mark
Mark / Sweep / Compact (MSC) 
2. Sweep
Mark / Sweep / Compact (MSC) 
3. Compact
GC’s en OpenJDK Hotspot 
● Serial Collector 
● Parallel Collector 
● CMS Collector 
● G1 (Garbage First) Collector
Parallel Collector 
YOUNG GENERATION OLD GENERATION 
Paralelo Serie / Paralelo 
Monolítico 
Stop-The-World 
Copying Mark /...
GC’s en OpenJDK Hotspot 
● Serial Collector 
● Parallel Collector 
● CMS Collector 
● G1 (Garbage First) Collector
Concurrent Mark & Sweep 
YOUNG GENERATION OLD GENERATION 
Paralelo Serie Y Paralelo 
Monolítico Incremental 
Stop-The-Worl...
Concurrent Mark & Sweep 
1. Initial Mark 
2. Concurrent Mark 
3. Remark 
4. Concurrent Sweep
CMS 
No compacta
CMS después de varias generaciones
Cuando hay excesiva 
fragmentación 
STW,Serial, Monolithic, MSC* 
*AKA: Full GC
GC’s en OpenJDK Hotspot 
● Serial Collector 
● Parallel Collector 
● CMS Collector 
● G1 (Garbage First) Collector
Garbage First (G1) 
- Retrasar al máximo un “Full GC” 
- Baja latencia 
- Predictibilidad 
- Fácil de usar
Garbage First (G1) 
- Divide el heap en regiones 
- Libera primero las que tienen más basura 
(Garbage First) 
- Compacta ...
E O 
O 
E 
O 
O 
O 
S 
G1 Heap Structure 
E
Garbage First (G1) 
1. Recolección de Young Collection 
2. Marcado concurrente 
3. Recolección mixta 
4. Full GC
Young collection 
E O 
O 
E E 
O 
O 
O 
E
Young collection 
O 
O 
O 
O 
O 
S
Garbage First (G1) 
1. Recolección de Young Collection 
2. Marcado concurrente 
3. Recolección mixta 
4. Full GC
Marcado concurrente 
E O 
O 
O 
O 
O 
E 
E O 
S 
O O
Marcado concurrente 
E O 
O 
E 
X 
O 
X 
O 
O O 
O
Garbage First (G1) 
1. Recolección de Young Collection 
2. Marcado concurrente 
3. Recolección mixta 
4. Full GC
Recolección mixta 
E O 
O 
E 
E X 
O 
X 
E 
O 
O O 
O 
O 
O 
O 
O
Recolección mixta 
E O 
O 
E 
E X 
O 
X 
E 
O 
O O 
O 
O 
O 
O 
O
Recolección mixta 
O 
O 
O 
X 
O 
O O 
O 
O 
O 
O 
S O
Garbage First (G1) 
1. Recolección de Young Collection 
2. Marcado concurrente 
3. Recolección mixta 
4. Full GC
Todos los GC’s de Hotspot 
tienen algún tipo de STW
STW 
es el mayor enemigo 
del rendimiento
Objetivos de optimización 
1. Maximizar recolección JOVEN 
2. Minimizar los STW 
3. Evitar objetos grandes 
4. Evitar rete...
Monitorizar la aplicación
Opciones de monitorización 
-Xloggc:<file> 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps
[GC [PSYoungGen: 578424K->8793K(630784K)] 
1007570K->444386K(1155072K), 0.0185270 secs] 
[Times: user=0.06 sys=0.00, real=...
[GC [PSYoungGen: 578424K->8793K(630784K)] 
1007570K->444386K(1155072K), 0.0185270 secs] 
[Times: user=0.06 sys=0.00, real=...
YOUNG SURVIVORS OLD 
Resumen del total
Análisis en detalle
Herramientas 
jcmd pid GC.class_histogram
num #instances #bytes class name 
---------------------------------------------- 
1: 762525 71798392 [C 
2: 41739 68376080...
Herramientas 
jcmd pid GC.class_histogram 
jcmd pid GC.heap_dump filename 
+ 
jhat heapdumpfile
Herramientas 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=path
Configurar la JVM
Configuraciones 
-Xmx / -Xms 
Tamaño máximo y mínimo del HEAP 
-XX:MaxGCPauseMillis=n 
Recomendación de pausas 
-XX:Surviv...
Tantas como para 
otra charla ;)
1. Estructura de la memoria 
2. Conceptos generales de GC 
3. Tipos de recolectores de Hotspot 
4. Configuración de Hotspo...
Con el recolector CMS, la recolección es “serie” y 
STW, y los hilos de tu aplicación serán detenidos 
por la duración com...
No es tan fiero el lobo 
como lo pintan
Alonso Torres 
@alotor @alotor 
mobro.co/alotor
Bonus (post-presentación) 
- Alternativas a JConsole 
○ VisualVM 
○ AppDynamics 
- Para medir paradas del GC 
○ JHiccup ht...
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
Upcoming SlideShare
Loading in …5
×

(Codemotion 2014) JVM GC: WTF?!

10,855 views

Published on

La máquina virtual y la plataforma Java se está convirtiendo en el pilar de multiples lenguajes: Java, Scala, Groovy, Clojure, Ceylon, JRuby... pero muchos desarrolladores no conocen como funciona por dentro tanto el sistema de memoria como el recolector de basura. Este conocimiento es fundamental y puede marcar la diferencia entre dos programadores.

Esta charla consisitirá en una introducción a la gestión de memoria de la JVM (Hotspot), cómo trabaja el recolector de basura o algunas opciones para poder configurar las opciones por defecto.

Si alguna vez te has cruzado con un OutOfMemoryError y no entendistes la línea que copiastes de StackOverflow: esta es tu charla.

Published in: Technology

(Codemotion 2014) JVM GC: WTF?!

  1. 1. JVM GC WTF?! Alonso Torres @alotor
  2. 2. Alonso Torres @alotor @alotor mobro.co/alotor
  3. 3. java.lang.OutOfMemoryError: unable to create new native thread java.lang.OutOfMemoryError: Stack overflow java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Metaspace java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC overhead limit exceeded java.lang.OutOfMemoryError: requested... Out of swap space?
  4. 4. SUCCESS
  5. 5. No tengo memoria!!! Todo va lento!!!!!! El GC es ineficiente!!!!!
  6. 6. With CMS GC, the full collection is serial and STW, hence your application threads are stopped for the entire duration while the heap space is reclaimed and then compacted. The duration for the STW pause depends on your heap size and the surviving objects. http://www.infoq.com/articles/G1-One-Garbage-Collector-To-Rule-Them-All
  7. 7. Con el recolector CMS, la recolección es “serie” y STW, y los hilos de tu aplicación serán detenidos por la duración completa mientras el espacio del “heap” es recuperado y compactado. La duración de la pausa STW dependerá del tamaño del “heap” y de los objetos supervivientes. http://www.infoq.com/articles/G1-One-Garbage-Collector-To-Rule-Them-All
  8. 8. JVM Java Virtual Machine GC Garbage Collectors WTF?! Why They Fail?!
  9. 9. 1. Estructura de la memoria 2. Conceptos generales de GC 3. Tipos de recolectores de Hotspot 4. Configuración de Hotspot
  10. 10. Os presento la JVM
  11. 11. JVM PROCESS: 1.591 Gb
  12. 12. JVM PROCESS: 1.591 Gb Memoria propia de la JVM
  13. 13. JVM PROCESS: 1.591 Gb Memoria de ejecución
  14. 14. JVM PROCESS: 1.591 Gb Memoria de datos
  15. 15. JVM PROCESS: 1.591 Gb Memoria de clases
  16. 16. HEAP - Bloque de memoria que la JVM se encargará de gestionar - Almacena los datos de los objetos - Memoria dinámica
  17. 17. OCUPADA LIBRE Max. Heap Size
  18. 18. OCUPADA LIBRE Max. Heap Size
  19. 19. OCUPADA LIBRE Max. Heap Size
  20. 20. OCUPADA LIBRE
  21. 21. OCUPADA LIBRE
  22. 22. AUMENTAMOS el heap ó LIBERAMOS memoria
  23. 23. OCUPADA LIBRE Aumenta el heap Liberamos el heap OCUPADA LIBRE
  24. 24. ¿Cómo liberamos la memoria que ya no necesitamos?
  25. 25. Garbage Collection 1. Busca todos los objetos vivos 2. Libera la memoria de los objetos muertos 3. Mueve la posición de memoria de los vivos
  26. 26. GC’s en OpenJDK Hotspot - Serial Collector - Parallel Collector - CMS Collector - G1
  27. 27. GC’s en OpenJDK Hotspot - Serial Collector - Parallel Collector - CMS Collector - G1
  28. 28. MALDITOS TÉRMINOS!!
  29. 29. Stop the World (STW) - Parada global de todos los hilos de ejecución para realizar recolección de basura - El contrario puede ser CONCURRENTE ○ La recolección se ejecuta a la vez que el programa
  30. 30. STW Concurrente
  31. 31. Paralelo ● La ejecución se realiza en varios hilos de ejecución ● Aprovecha sistemas con múltiples CPUs ● Por contra puede ser SERIE ○ Sólo se ejecutaría en un hilo
  32. 32. Paralelo Serie
  33. 33. Incremental ● El trabajo de recolección no se realiza en un único paso sino en varias fases o pasos ● Por el contrario puede ser MONOLÍTICO ○ Todo se ejecuta en un sólo paso
  34. 34. Incremental Monolítico
  35. 35. Weak Generational Hypothesis - La mayoría de los objetos mueren jóvenes - Los objetos viejos no suelen referenciar a objetos jóvenes
  36. 36. Generational GC Dos tipos de recolección: ○ 1 espacio pequeño con muchos muertos ○ 1 espacio grande donde casi todos vivos
  37. 37. Número de objetos vivos Número de objetos
  38. 38. TODOS los GC’s son generacionales
  39. 39. Generational heap structure YOUNG OLD/TENURE
  40. 40. Generational heap structure SURVIVORS SURVIVORS EDEN OLD/TENURE
  41. 41. Recolectamos la Young Generation Objetos promocionados van a supervivientes y a la Old Generation
  42. 42. La Old Generation está llena Necesitamos una recolección completa
  43. 43. Empty young and survivors. Free dead old-gen objects
  44. 44. GC’s en OpenJDK Hotspot ● Serial Collector ● Parallel Collector ● CMS Collector ● G1 (Garbage First) Collector
  45. 45. Serial Collector YOUNG GENERATION OLD GENERATION Serial Monolithic Stop-The-World Copying Mark / Sweep / Compact
  46. 46. Algoritmo de COPIA (Scavenge) - Copia los objetos vivos de una región de la memoria a otra - Libera la zona de memoria antigua
  47. 47. Mark / Sweep / Compact (MSC) 1. Mark
  48. 48. Mark / Sweep / Compact (MSC) 2. Sweep
  49. 49. Mark / Sweep / Compact (MSC) 3. Compact
  50. 50. GC’s en OpenJDK Hotspot ● Serial Collector ● Parallel Collector ● CMS Collector ● G1 (Garbage First) Collector
  51. 51. Parallel Collector YOUNG GENERATION OLD GENERATION Paralelo Serie / Paralelo Monolítico Stop-The-World Copying Mark / Sweep / Compact
  52. 52. GC’s en OpenJDK Hotspot ● Serial Collector ● Parallel Collector ● CMS Collector ● G1 (Garbage First) Collector
  53. 53. Concurrent Mark & Sweep YOUNG GENERATION OLD GENERATION Paralelo Serie Y Paralelo Monolítico Incremental Stop-The-World STW Y Concurrente Copying Mark and Sweep
  54. 54. Concurrent Mark & Sweep 1. Initial Mark 2. Concurrent Mark 3. Remark 4. Concurrent Sweep
  55. 55. CMS No compacta
  56. 56. CMS después de varias generaciones
  57. 57. Cuando hay excesiva fragmentación STW,Serial, Monolithic, MSC* *AKA: Full GC
  58. 58. GC’s en OpenJDK Hotspot ● Serial Collector ● Parallel Collector ● CMS Collector ● G1 (Garbage First) Collector
  59. 59. Garbage First (G1) - Retrasar al máximo un “Full GC” - Baja latencia - Predictibilidad - Fácil de usar
  60. 60. Garbage First (G1) - Divide el heap en regiones - Libera primero las que tienen más basura (Garbage First) - Compacta sobre la marcha
  61. 61. E O O E O O O S G1 Heap Structure E
  62. 62. Garbage First (G1) 1. Recolección de Young Collection 2. Marcado concurrente 3. Recolección mixta 4. Full GC
  63. 63. Young collection E O O E E O O O E
  64. 64. Young collection O O O O O S
  65. 65. Garbage First (G1) 1. Recolección de Young Collection 2. Marcado concurrente 3. Recolección mixta 4. Full GC
  66. 66. Marcado concurrente E O O O O O E E O S O O
  67. 67. Marcado concurrente E O O E X O X O O O O
  68. 68. Garbage First (G1) 1. Recolección de Young Collection 2. Marcado concurrente 3. Recolección mixta 4. Full GC
  69. 69. Recolección mixta E O O E E X O X E O O O O O O O O
  70. 70. Recolección mixta E O O E E X O X E O O O O O O O O
  71. 71. Recolección mixta O O O X O O O O O O O S O
  72. 72. Garbage First (G1) 1. Recolección de Young Collection 2. Marcado concurrente 3. Recolección mixta 4. Full GC
  73. 73. Todos los GC’s de Hotspot tienen algún tipo de STW
  74. 74. STW es el mayor enemigo del rendimiento
  75. 75. Objetivos de optimización 1. Maximizar recolección JOVEN 2. Minimizar los STW 3. Evitar objetos grandes 4. Evitar retención de objetos
  76. 76. Monitorizar la aplicación
  77. 77. Opciones de monitorización -Xloggc:<file> -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
  78. 78. [GC [PSYoungGen: 578424K->8793K(630784K)] 1007570K->444386K(1155072K), 0.0185270 secs] [Times: user=0.06 sys=0.00, real=0.02 secs] [GC [PSYoungGen: 580697K->15128K(636928K)] 1016290K->459169K(1161216K), 0.0236090 secs] [Times: user=0.08 sys=0.01, real=0.02 secs] [GC [PSYoungGen: 450179K->6893K(635904K)] 894221K->465458K(1160192K), 0.0249430 secs] [Times: user=0.07 sys=0.02, real=0.02 secs] [Full GC [PSYoungGen: 6893K->0K(635904K)] [ParOldGen: 458564K->454236K(816128K)] 465458K->454236K(1452032K) [PSPermGen: 171991K->171852K(344064K)], 2.5341620 secs] [Times: user=8.48 sys=0.01, real=2.53 secs]
  79. 79. [GC [PSYoungGen: 578424K->8793K(630784K)] 1007570K->444386K(1155072K), 0.0185270 secs] [Times: user=0.06 sys=0.00, real=0.02 secs] [GC [PSYoungGen: 580697K->15128K(636928K)] 1016290K->459169K(1161216K), 0.0236090 secs] [Times: user=0.08 sys=0.01, real=0.02 secs] [GC [PSYoungGen: 450179K->6893K(635904K)] 894221K->465458K(1160192K), 0.0249430 secs] [Times: user=0.07 sys=0.02, real=0.02 secs] [Full GC [PSYoungGen: 6893K->0K(635904K)] Recolección Young Generation [ParOldGen: 458564K->454236K(816128K)] 465458K->454236K(1452032K) [PSPermGen: 171991K->171852K(344064K)], 2.5341620 secs] [Times: user=8.48 sys=0.01, real=2.53 secs] Full GC (STW)
  80. 80. YOUNG SURVIVORS OLD Resumen del total
  81. 81. Análisis en detalle
  82. 82. Herramientas jcmd pid GC.class_histogram
  83. 83. num #instances #bytes class name ---------------------------------------------- 1: 762525 71798392 [C 2: 41739 68376080 [B 3: 675097 54007760 java.lang.reflect.Method 4: 404377 51770560 <methodKlass> 5: 404377 49495808 <constMethodKlass> 6: 864167 48393352 org.codehaus.groovy.runtime.metaclass. 7: 17110 29966392 <constantPoolKlass> 8: 710424 22733568 java.util.HashMap$Entry 9: 13777 18368640 <constantPoolCacheKlass> 10: 760859 18260616 java.lang.String 11: 507462 15419000 [Ljava.lang.Object; 12: 17104 14833688 <instanceKlassKlass> 13: 85375 12536048 [Lorg.codehaus.groovy.util.ComplexKeyHashMap$En 14: 303170 9701440 org.codehaus.groovy.util.SingleKeyHashMap$Entry 15: 386458 9274992 org.codehaus.groovy.util.FastArray 16: 50174 8596088 [Ljava.util.HashMap$Entry; 17: 333114 7010016 [Ljava.lang.Class;
  84. 84. Herramientas jcmd pid GC.class_histogram jcmd pid GC.heap_dump filename + jhat heapdumpfile
  85. 85. Herramientas -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=path
  86. 86. Configurar la JVM
  87. 87. Configuraciones -Xmx / -Xms Tamaño máximo y mínimo del HEAP -XX:MaxGCPauseMillis=n Recomendación de pausas -XX:SurvivorRatio=n Tamaño del espacio de supervivientes
  88. 88. Tantas como para otra charla ;)
  89. 89. 1. Estructura de la memoria 2. Conceptos generales de GC 3. Tipos de recolectores de Hotspot 4. Configuración de Hotspot
  90. 90. Con el recolector CMS, la recolección es “serie” y STW, y los hilos de tu aplicación serán detenidos por la duración completa mientras el espacio del “heap” es recuperado y compactado. La duración de la pausa STW dependerá del tamaño del “heap” y de los objetos supervivientes. http://www.infoq.com/articles/G1-One-Garbage-Collector-To-Rule-Them-All
  91. 91. No es tan fiero el lobo como lo pintan
  92. 92. Alonso Torres @alotor @alotor mobro.co/alotor
  93. 93. Bonus (post-presentación) - Alternativas a JConsole ○ VisualVM ○ AppDynamics - Para medir paradas del GC ○ JHiccup http://www.azulsystems.com/product/jHiccup ○ JMeter

×