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:
-
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).
-
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.
-
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.
- Almacena información sobre las clases cargadas:
-
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) |