Recolección de basura y compilación Just-In-Time (JIT)

Optimizing Code in Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Recolección de basura: conceptos básicos

Gestión manual de memoria (C/C++)

  • La persona programadora reserva y libera memoria explícitamente
  • Propensa a fugas

$$

Recolección de basura en Java

  • Asignación automática de memoria
  • Detección automática de objetos no usados
  • Liberación automática de memoria
Optimizing Code in Java

Cómo funciona la recolección de basura

  • Marcar: identificar objetos alcanzables desde las raíces
  • Barrer: eliminar objetos inalcanzables

Captura de pantalla 2025-05-11 a las 18:58:38.png

Optimizing Code in Java

Recolección de basura y rendimiento

Compromisos de rendimiento del GC

  • Simplifica el desarrollo, pero con implicaciones en el rendimiento

$$

Algoritmos de GC

  • Las JVM modernas ofrecen varios algoritmos de recolección
  • La elección depende de los requisitos de la aplicación
  • Una guía en profundidad sobre algoritmos de GC está aquí
1 https://www.baeldung.com/jvm-garbage-collectors
Optimizing Code in Java

Impacto del GC en el rendimiento

// Mal: crear muchos objetos de vida corta
for (int i = 0; i < 1000000; i++) {
    new Object(); // Se convierte en basura de inmediato
}


// Mejor: reutilizar objetos Object obj; for (int i = 0; i < 1000000; i++) { obj = new Object(); // Solo una referencia }
Optimizing Code in Java

Código amigable con el GC

// Evita esto en código crítico de rendimiento
String result = "";
for (int i = 0; i < 100000; i++) {
    result += i; // Crea un String nuevo cada vez
}


// Enfoque mejor StringBuilder builder = new StringBuilder(); for (int i = 0; i < 100000; i++) { builder.append(i); // Reusa el mismo buffer } String result = builder.toString();
Optimizing Code in Java

Compilación Just-In-Time

  • Proceso de ejecución de la JVM:
    • Código fuente Java -> bytecode
    • Bytecode -> ejecución interpretada
    • Métodos «calientes» -> código máquina nativo
  • Optimiza el código que se ejecuta con frecuencia
Optimizing Code in Java

Patrones de código favorables al JIT

  • Escribe código predecible
// Ramas predecibles ayudan a la optimización del JIT
if (value > 0) {
    // Código A: ruta tomada con frecuencia
} else {
    // Código B: ruta poco frecuente
}
  • Crea métodos enfocados y pequeños
  • Los métodos pequeños y frecuentes son ideales para inlining
  • El código complejo puede optimizarse peor
Optimizing Code in Java

Resumen

  • Minimiza la creación de objetos en rutas críticas de rendimiento
  • Escribe código predecible alineado con las capacidades del JIT
  • Optimiza donde importa, tras perfilar primero
Optimizing Code in Java

¡Vamos a practicar!

Optimizing Code in Java

Preparing Video For Download...