Sobes.tech
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:

  1. 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).
  2. 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.
  3. 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.
  4. 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)