SlideShare uma empresa Scribd logo
1 de 63
Baixar para ler offline
JVM Tuning
Lo que debes saber antes de subir a producción
@edusanchezcon
Sobre mí
Eduardo Sánchez
@edusanchezcon
github.com/EduSanchezCon
Consultor tecnológico en
NOT
AN
EXPERT
Qué vamos a ver
* Tests de carga
* Tuning de memoria
* Tuning de rendimiento
JVM tuning: Lo que debes saber antes de subir a producción
Suda en desarrollo
para no sangrar en producción
@edusanchezcon
Tests de carga
Hay que probar un uso similar a la que tendrá en producción
Carga proporcional
Funcionalidad coherente
Entorno parecido
@edusanchezcon
Tests de carga: Medir y Monitorizar
Medir para saber cuánto
Tiempo de respuesta
Operaciones / Tiempo
Tiempo total por lote
Monitorizar para saber por qué
Sistema: CPU, Memoria, Disco
JVM: Memoria (Heap), GCs
Logs, Sampling, Profilers
@edusanchezcon
Load Test
Uso similar al de producción
Tests de carga: Tipos
@edusanchezcon
Capacity Test
Degradación en función de la carga
Tests de carga: Tipos
@edusanchezcon
Stress Test
Comportamiento ante una carga por encima de sus capacidades
Tests de carga: Tipos
@edusanchezcon
Recovery Test
Recuperación tras un desastre (fallo de BD, llenado de disco…)
Tests de carga: Tipos
@edusanchezcon
Soak Test
Degradación en función del tiempo
Tests de carga: Tipos
@edusanchezcon
JMeter, LoadUI, WebLoad, Gatling
JVisualVM, JConsole, Java Mission Control, Java Flight Recorder
Tests de carga: Herramientas
Y mucho más: Grafana, JMX events, integración en CI…
Qué vamos a ver
* Tests de carga
* Performance Tuning
* Memory Tuning
JVM
Unboxing
@edusanchezcon
Process Memory
La memoria en la JVM
@edusanchezcon
Heap
Metaspace
Code
Cache
Thread
N
Thread
2
Thread
1
La memoria en la JVM
-Xms
-Xmx
@edusanchezcon
Young Generation
Metaspace
Code
Cache
Old Generation
Eden survivor
1 2
compressed
class space
PC Register
JVM Stack
Native Stack
Thread
N
La memoria en la JVM
@edusanchezcon
La memoria en la JVM (JDK ≤ 7)
Young Generation
Thread
N
Old Generation
Eden survivor
1 2
PC Register
JVM Stack
Native Stack
PermGen
Code
Cache
@edusanchezcon
¿Cómo se gestiona la Memoria?
No se libera memoria explícitamente
El Garbage Collector libera lo que ya no se usa
@edusanchezcon
C
B
D
E
N
A J
H
I
F
G
M
K
L
Q
P
¿Cómo se detecta lo que ya no se usa?
@edusanchezcon
C
B
D
E
N
A J
H
I
F
G
M
K
L
Q
P
¿Cómo se detecta lo que ya no se usa?
@edusanchezcon
C
B
D
E
N
A J
H
I
F
G
M
K
L
Q
P
static
Thread
¿Cómo se detecta lo que ya no se usa?
@edusanchezcon
C
B
D
E
N
A
J
H
I
F
G
M
K
L
Q
P
GC Roots
Reachable Objects
Non Reachable Objects
¿Cómo se detecta lo que ya no se usa?
@edusanchezcon
C
B
D
E
A
J
H
I
F
G
KP
GC Roots
Reachable Objects
¿Cómo se detecta lo que ya no se usa?
Hipótesis generacional
Objetos, peces,
la mayoría mueren jovenes
@edusanchezcon
Old GenerationEden
Survivors
1 2
Generational Collection
@edusanchezcon
Old GenerationEden
Survivors
1 2
Generational Collection
@edusanchezcon
Old GenerationEden
Survivors
1 2
Generational Collection
@edusanchezcon
Old GenerationEden
Survivors
1 2
Generational Collection
@edusanchezcon
Old GenerationEden
Survivors
1 2
Generational Collection
@edusanchezcon
Old GenerationEden
Survivors
1 2
Generational Collection
@edusanchezcon
Old GenerationEden
Survivors
1 2
Generational Collection
@edusanchezcon
Old GenerationEden
Survivors
1 2
Generational Collection
@edusanchezcon
Old GenerationEden
Survivors
1 2
Generational Collection
JVM tuning: Lo que debes saber antes de subir a producción
@edusanchezcon
Epsilon GC
Garbage Collectors
G1 GC
Concurrent Mark & Sweep
Z GC
Shenandoah
Stop The World Concurrent
Serial GC
Parallel GC
Regionalized
@edusanchezcon
G1GC
E
E
T
T
T
T
T
T
E
T
T
E
T
T
T
T
T
T
S2
T
T
T
T
T
T
T
S1
T
S2
H
T
T
S1
T
T
T
H
T
T
HH H
@edusanchezcon
Heap: Problemas comunes
OutOfMemoryError: Java heap space|GC overhead limit exceeded
Dimensionamiento incorrecto de la memoria
Memory leak
No Referenced Referenced
Not Used Used
{
leak
@edusanchezcon
Heap: Diagnóstico
Heap Dumps
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path-to-hd
jcmd <pid> GC.heap_dump <path>
JVisualVM, JConsole, Java Mission Control
Sin Full GC previo: jcmd <pid> GC.heap_dump -all <path>
Análisis: Eclipse Memory Analyzer Tool
Ahí te hemos dejado el dump
@edusanchezcon
Monitorización continua del tamaño del Heap
Configuración de frameworks/librerías de terceros
Heap: Recomendaciones
-Xms = -Xmx
@edusanchezcon
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<file-path>
Java 9+ -xlog
Garbage Collector: GC Logs
SIEMPRE ACTIVADO EN PRODUCCIÓN
@edusanchezcon
Garbage Collector: GC Logs
2018-11-19T10:49:38.496-0100: 17.830:
[Full GC (Ergonomics)
[PSYoungGen: 256K->0K(43008K)]
[ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K),
[Metaspace: 5450K->5442K(1056768K)],
0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
@edusanchezcon
2018-11-19T10:49:38.496-0100: 17.830:
[Full GC (Ergonomics)
[PSYoungGen: 256K->0K(43008K)]
[ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K),
[Metaspace: 5450K->5442K(1056768K)],
0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
Timestamp absoluto del gc
Garbage Collector: GC Logs
@edusanchezcon
2018-11-19T10:49:38.496-0100: 17.830:
[Full GC (Ergonomics)
[PSYoungGen: 256K->0K(43008K)]
[ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K),
[Metaspace: 5450K->5442K(1056768K)],
0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
Timestamp relativo al inicio de la JVM
Garbage Collector: GC Logs
@edusanchezcon
2018-11-19T10:49:38.496-0100: 17.830:
[Full GC (Ergonomics)
[PSYoungGen: 256K->0K(43008K)]
[ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K),
[Metaspace: 5450K->5442K(1056768K)],
0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
Causa del GC
Garbage Collector: GC Logs
@edusanchezcon
2018-11-19T10:49:38.496-0100: 17.830:
[Full GC (Ergonomics)
[PSYoungGen: 256K->0K(43008K)]
[ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K),
[Metaspace: 5450K->5442K(1056768K)],
0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
Región de memoria
Garbage Collector: GC Logs
@edusanchezcon
2018-11-19T10:49:38.496-0100: 17.830:
[Full GC (Ergonomics)
[PSYoungGen: 256K->0K(43008K)]
[ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K),
[Metaspace: 5450K->5442K(1056768K)],
0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
Espacio antes y después del GC (capacidad de la región de memoria)
Garbage Collector: GC Logs
@edusanchezcon
2018-11-19T10:49:38.496-0100: 17.830:
[Full GC (Ergonomics)
[PSYoungGen: 256K->0K(43008K)]
[ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K),
[Metaspace: 5450K->5442K(1056768K)],
0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
Espacio antes y después dell GC (capacidad total del Heap)
Garbage Collector: GC Logs
@edusanchezcon
2018-11-19T10:49:38.496-0100: 17.830:
[Full GC (Ergonomics)
[PSYoungGen: 256K->0K(43008K)]
[ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K),
[Metaspace: 5450K->5442K(1056768K)],
0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
Tiempo real
Garbage Collector: GC Logs
@edusanchezcon
2018-11-19T10:49:38.496-0100: 17.830:
[Full GC (Ergonomics)
[PSYoungGen: 256K->0K(43008K)]
[ParOldGen: 46473K->1524K(46592K)] 46729K->1524K(89600K),
[Metaspace: 5450K->5442K(1056768K)],
0.0075023 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
Tiempo de CPU
Garbage Collector: GC Logs
Qué vamos a ver
* Tests de carga
* Memory Tuning
* Performance Tuning
“Premature optimization
is the root of all evil”
Donald Knuth
@edusanchezcon
Nuestro código vs lo que se ejecuta
Interprete
Bytecode
Compilador
Código máquina
optimizado
@edusanchezcon
Nuestro código vs lo que se ejecuta
Interprete
Bytecode
C1
Código máquina
C2
Código máquina
optimizado
@edusanchezcon
Optimizaciones del JIT Compiler
‣ Trivial inlining
‣ Call graph inlining
‣ Tail recursion elimination
‣ Virtual call guard optimizations
‣ Local data flow analyses and optimizations
‣ Register usage optimization
‣ Simplifications of Java idioms
‣ Code reordering, splitting, and removal
‣ Loop reduction and inversion
‣ Loop striding and loop-invariant code motion
‣ Loop unrolling and peeling
‣ Loop versioning and specialization
‣ Exception-directed optimization
‣ Switch analysis
‣ Global data flow analyses and optimizations
‣ Partial redundancy elimination
‣ Escape analysis
‣ GC and memory allocation optimizations
‣ Synchronization optimizations
@edusanchezcon
Ciclo de performance tuning
Determinar la carga máxima
Localizar el cuello de botella Solucionar el problema
Load Test
Sampler/Profiler
@edusanchezcon
Ejemplo práctico
-XX:+UnlockCommercialFeatures -XX:FlightRecorder
@edusanchezcon
Operaciones de Entrada / Salida
Cuellos de botella frecuentes
Ejecutar muchas veces lo mismo (de manera innecesaria)
Dimensionamiento ineficiente de pools de hilos
Wanna go faster?
No GCs
Native Memory
Specialized Collections
CharSequence
JVM tuning: Lo que debes saber antes de subir a producción
? @edusanchezcon

Mais conteúdo relacionado

Último

Algoritmos Paralelos - Actividad 14 - UNIBE.pdf
Algoritmos Paralelos - Actividad 14 - UNIBE.pdfAlgoritmos Paralelos - Actividad 14 - UNIBE.pdf
Algoritmos Paralelos - Actividad 14 - UNIBE.pdfdarosario3d
 
03 - RUP_Elaboracion_Construccion_1_2024.pdf
03 - RUP_Elaboracion_Construccion_1_2024.pdf03 - RUP_Elaboracion_Construccion_1_2024.pdf
03 - RUP_Elaboracion_Construccion_1_2024.pdfRodrigo Cerón
 
Simuladores de circuitos electrónicos.pdf
Simuladores de circuitos electrónicos.pdfSimuladores de circuitos electrónicos.pdf
Simuladores de circuitos electrónicos.pdfLeonardoOa4
 
02 - RUP_Introduccion_Definicion.pdf
02 - RUP_Introduccion_Definicion.pdf02 - RUP_Introduccion_Definicion.pdf
02 - RUP_Introduccion_Definicion.pdfRodrigo Cerón
 
Formato de práctica reflexiva ante una problemática social.docx.pdf
Formato de práctica reflexiva ante una problemática social.docx.pdfFormato de práctica reflexiva ante una problemática social.docx.pdf
Formato de práctica reflexiva ante una problemática social.docx.pdfjuanrubenc78
 
Virus -Josue Cabascango _20240322_194349_0000.pdf
Virus -Josue Cabascango _20240322_194349_0000.pdfVirus -Josue Cabascango _20240322_194349_0000.pdf
Virus -Josue Cabascango _20240322_194349_0000.pdfMiSpotify
 
Diseño de Algoritmos Paralelos. Mejorando la eficiencia computacional aprovec...
Diseño de Algoritmos Paralelos. Mejorando la eficiencia computacional aprovec...Diseño de Algoritmos Paralelos. Mejorando la eficiencia computacional aprovec...
Diseño de Algoritmos Paralelos. Mejorando la eficiencia computacional aprovec...AlexaRamirez39
 
Los mejores simuladores electrónicos que se pueden utilizar
Los mejores simuladores electrónicos que se pueden utilizarLos mejores simuladores electrónicos que se pueden utilizar
Los mejores simuladores electrónicos que se pueden utilizarjosuesj13
 
Herramientas de Mantenimiento_Soporte Técnico_David Andrade.pdf
Herramientas de Mantenimiento_Soporte Técnico_David Andrade.pdfHerramientas de Mantenimiento_Soporte Técnico_David Andrade.pdf
Herramientas de Mantenimiento_Soporte Técnico_David Andrade.pdfdaa100407
 

Último (9)

Algoritmos Paralelos - Actividad 14 - UNIBE.pdf
Algoritmos Paralelos - Actividad 14 - UNIBE.pdfAlgoritmos Paralelos - Actividad 14 - UNIBE.pdf
Algoritmos Paralelos - Actividad 14 - UNIBE.pdf
 
03 - RUP_Elaboracion_Construccion_1_2024.pdf
03 - RUP_Elaboracion_Construccion_1_2024.pdf03 - RUP_Elaboracion_Construccion_1_2024.pdf
03 - RUP_Elaboracion_Construccion_1_2024.pdf
 
Simuladores de circuitos electrónicos.pdf
Simuladores de circuitos electrónicos.pdfSimuladores de circuitos electrónicos.pdf
Simuladores de circuitos electrónicos.pdf
 
02 - RUP_Introduccion_Definicion.pdf
02 - RUP_Introduccion_Definicion.pdf02 - RUP_Introduccion_Definicion.pdf
02 - RUP_Introduccion_Definicion.pdf
 
Formato de práctica reflexiva ante una problemática social.docx.pdf
Formato de práctica reflexiva ante una problemática social.docx.pdfFormato de práctica reflexiva ante una problemática social.docx.pdf
Formato de práctica reflexiva ante una problemática social.docx.pdf
 
Virus -Josue Cabascango _20240322_194349_0000.pdf
Virus -Josue Cabascango _20240322_194349_0000.pdfVirus -Josue Cabascango _20240322_194349_0000.pdf
Virus -Josue Cabascango _20240322_194349_0000.pdf
 
Diseño de Algoritmos Paralelos. Mejorando la eficiencia computacional aprovec...
Diseño de Algoritmos Paralelos. Mejorando la eficiencia computacional aprovec...Diseño de Algoritmos Paralelos. Mejorando la eficiencia computacional aprovec...
Diseño de Algoritmos Paralelos. Mejorando la eficiencia computacional aprovec...
 
Los mejores simuladores electrónicos que se pueden utilizar
Los mejores simuladores electrónicos que se pueden utilizarLos mejores simuladores electrónicos que se pueden utilizar
Los mejores simuladores electrónicos que se pueden utilizar
 
Herramientas de Mantenimiento_Soporte Técnico_David Andrade.pdf
Herramientas de Mantenimiento_Soporte Técnico_David Andrade.pdfHerramientas de Mantenimiento_Soporte Técnico_David Andrade.pdf
Herramientas de Mantenimiento_Soporte Técnico_David Andrade.pdf
 

JVM tuning: Lo que debes saber antes de subir a producción