Sobes.tech
Middle

¿Cómo está estructurada la memoria en Java?

sobes.tech AI

Respuesta de la IA

En Java, la memoria se gestiona automáticamente mediante el recolector de basura y se divide en varias áreas:

  1. Heap (Montón):

    • Almacena objetos de clases y arreglos.
    • Una para todos los hilos de la aplicación.
    • El recolector de basura trabaja con esta área.
    • Está dividida en generaciones (Joven, Vieja, Permanente).
  2. Stack (Pila):

    • Cada hilo tiene su propia pila.
    • Almacena variables locales de tipos primitivos y referencias a objetos en el montón.
    • Los datos se añaden y eliminan según el principio LIFO (Last-In, First-Out).
    • Se libera automáticamente al finalizar el método.
  3. Method Area (Área de métodos) / PermGen (hasta Java 8) / Metaspace (a partir de Java 8):

    • Almacena información sobre las clases cargadas:
      • Metadatos de clases.
      • Bytecode de métodos.
      • Variables estáticas.
      • Constantes del pool.
    • El tamaño de PermGen era fijo, Metaspace usa memoria nativa y puede expandirse dinámicamente.
  4. Native Method Stacks (Pilas de métodos nativos):

    • Se usa para llamadas a métodos nativos (por ejemplo, C/C++).
    • Se libera al finalizar el método nativo.
// Ejemplo de uso de memoria
public class MemoryExample {

    private String instanceVariable; // Se almacena en el Heap

    public void myMethod(int parameter) { // parameter se almacena en la Stack

        int localVar = 10; // localVar se almacena en la Stack

        String localString = "hello"; // "hello" en String Pool (parte del Heap/Method Area), la referencia localString en la Stack

        Object obj = new Object(); // Object en el Heap, la referencia obj en la Stack

        Integer wrapper = new Integer(5); // Integer en el Heap, la referencia wrapper en la Stack
    }

    public static void main(String[] args) {
        MemoryExample example = new MemoryExample();
        example.myMethod(20);
    }
}

Áreas de memoria y su contenido:

Área ¿Dónde está? ¿Qué almacena? Gestión
Heap Compartido para la JVM Objetos, arreglos Recolector de basura
Stack Propia para cada hilo Variables locales primitivas, referencias a objetos Automático (al finalizar el método)
Method Area Compartido para la JVM Metadatos de clases, variables estáticas, bytecode, constantes Recolector de basura (para clases y estáticos)
Native Stacks Propia para cada hilo (al llamar) Variables y datos de métodos nativos Automático (al finalizar el método nativo)