Middle
Como é que a memória está estruturada em Java?
sobes.tech IA
Resposta da IA
Em Java, a memória é gerida automaticamente pelo coletor de lixo e é dividida em várias áreas:
-
Heap (Heap):
- Armazena objetos de classes e arrays.
- Uma para todos os threads da aplicação.
- O coletor de lixo trabalha com esta área.
- Está dividida em gerações (Jovem, Velho, Permanente).
-
Stack (Pilha):
- Cada thread tem sua própria pilha.
- Armazena variáveis locais de tipos primitivos e referências a objetos no heap.
- Os dados são adicionados e removidos segundo o princípio LIFO (Last-In, First-Out).
- É liberada automaticamente ao terminar o método.
-
Method Area (Área de métodos) / PermGen (até Java 8) / Metaspace (a partir do Java 8):
- Armazena informações sobre as classes carregadas:
- Metadados das classes.
- Bytecode dos métodos.
- Variáveis estáticas.
- Constantes do pool.
- O tamanho do PermGen era fixo, o Metaspace usa memória nativa e pode expandir-se dinamicamente.
- Armazena informações sobre as classes carregadas:
-
Native Method Stacks (Pilhas de métodos nativos):
- Usado para chamadas a métodos nativos (por exemplo, C/C++).
- É liberada ao terminar o método nativo.
// Exemplo de uso de memória
public class MemoryExample {
private String instanceVariable; // Armazenada no Heap
public void myMethod(int parameter) { // parâmetro armazenado na Stack
int localVar = 10; // localVar na Stack
String localString = "hello"; // "hello" no String Pool (parte do Heap/Method Area), a referência localString na Stack
Object obj = new Object(); // Object no Heap, a referência obj na Stack
Integer wrapper = new Integer(5); // Integer no Heap, a referência wrapper na Stack
}
public static void main(String[] args) {
MemoryExample example = new MemoryExample();
example.myMethod(20);
}
}
Áreas de memória e seu conteúdo:
| Área | Onde está? | O que armazena? | Gestão |
|---|---|---|---|
| Heap | Compartilhada para a JVM | Objetos, arrays | Coletor de lixo |
| Stack | Própria para cada thread | Variáveis locais primitivas, referências a objetos | Automático (ao terminar o método) |
| Method Area | Compartilhada para a JVM | Metadados de classes, variáveis estáticas, bytecode, constantes | Coletor de lixo (para classes e estáticos) |
| Native Stacks | Própria para cada thread (ao chamar) | Variáveis e dados de métodos nativos | Automático (ao terminar o método nativo) |