Comprender la arquitectura de memoria de la JVM

Optimizing Code in Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

¿Qué es la JVM?

  • Entorno de ejecución independiente de la plataforma
  • Convierte bytecode (.class) en código máquina
  • Gestión de memoria y recolección de basura
  • Compilación Just-In-Time
Optimizing Code in Java

Visión general de la arquitectura de memoria de la JVM

La arquitectura de memoria de la JVM

Optimizing Code in Java

Memoria de pila (Stack)

  • Área de memoria para ejecutar métodos y variables locales
  • Estructura LIFO (Last-In-First-Out)
  • Almacena:
    • Variables locales
    • Tipos primitivos
    • Información de llamadas a métodos
  • StackOverflowError si se excede el tamaño
Optimizing Code in Java

Memoria de montón (Heap)

  • Almacena todos los objetos y arrays
  • new crea un objeto y lo ubica en el heap
  • Gestionada por el recolector de basura
  • Tamaño dinámico
  • Dividida en generaciones
Optimizing Code in Java

Memoria en acción

public void processData() {
    int count = 0;                  // Stack

String name = "Java"; // Heap
List<String> items = // Reference on Stack new ArrayList<>(); // Object on Heap
items.add(new String("Item")); // Object on Heap }
Optimizing Code in Java

Patrones de código eficientes en memoria

// Ineficiente
List<String> list1 = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    String s = new String("value"); // 1000 objetos
    list1.add(s);
}

// Mejor
List<String> list2 = new ArrayList<>();
String s = "value";  // Un solo objeto
for (int i = 0; i < 1000; i++) {
    list2.add(s);
}
Optimizing Code in Java

Resumen

  • La JVM gestiona la memoria (principalmente) con las áreas stack y heap
  • Memoria de pila -> rápida; guarda primitivos y referencias
  • Memoria de montón -> guarda objetos
Optimizing Code in Java

¡Vamos a practicar!

Optimizing Code in Java

Preparing Video For Download...