Fique por dentro – Concurso de TI! Explicando a estrutura da JVM

Baixe o material de estudo



Baixar apostila para concurso

Fala, meus consagrados! Beleza?

A Java Virtual Machine (JVM) é um pilar fundamental da plataforma Java, desempenhando um papel crucial na execução de aplicações Java com portabilidade e segurança aprimoradas. Este artigo visa explorar dois de seus componentes mais cruciais: a Heap Space e a Stack Memory. Essas áreas de memória não apenas desempenham papéis distintos na execução de aplicações Java, mas também são fundamentais para o gerenciamento eficiente de recursos e a otimização de performance.

A Java Stack Memory, ou simplesmente Java Stack, é responsável pelo armazenamento de frames de método ou stack frames. Cada frame contém partes de código que estão sendo executadas, incluindo variáveis locais, resultados parciais e o fluxo de execução. Quando um método é chamado, um frame é criado e empilhado na Java Stack. Quando o método termina, seu frame correspondente é descartado.

Figura 1: Estrutura da JVM.

 A Java Stack é caracterizada por ser uma área de memória de execução rápida e de gerenciamento LIFO (Last-In, First-Out), o que significa que o último frame a ser empilhado é o primeiro a ser descartado. Esse comportamento é ideal para o gerenciamento de chamadas de métodos e execução, pois assegura que os métodos mais recentemente chamados são processados primeiro. A Java Stack é thread-safe, pois cada thread que é criado em uma aplicação Java possui sua própria Java Stack, evitando assim condições de corrida e problemas de concorrência.

Java Stack Memory:

  • É usada para:
    • Alocação de memória estática;
    • Execução de uma thread; e
  • Contém:
    • Valores primitivos específicos para um método; e
    • Referências a objetos que estão em um heap referenciados a partir do método.

Características-chave da Java Stack Memory:

  • Cresce à medida que novos métodos são chamados;
  • Diminui à medida que os métodos são retornados;
  • As variáveis dentro da pilha existem apenas enquanto o método que as criou está sendo executado;
  • É automaticamente alocada e desalocada quando o método termina a execução;
  • Se estiver cheia:
    • O Java lançará java.lang.StackOverFlowError;
  • O seu acesso é rápido quando comparado à memória heap;
  • É threadsafe;
    • Cada thread opera em sua própria pilha.

O Java Heap Space, por outro lado, é a área de memória utilizada pela JVM para armazenar objetos dinamicamente alocados. Isso inclui instâncias de classes e arrays. Diferente da Java Stack, o Heap é acessado e gerenciado de forma mais complexa, pois alocar e desalocar memória no Heap pode ser uma operação custosa e sujeita a fragmentação de memória.

O gerenciamento do Heap é feito pelo Garbage Collector (GC) da JVM, que automaticamente identifica e descarta objetos que não são mais utilizados, liberando espaço para novos objetos. Essa capacidade de gerenciamento automático da memória é uma das grandes vantagens do Java, pois reduz significativamente o risco de vazamentos de memória e outros problemas relacionados.

O Java Heap é dividido em várias regiões, como a Young Generation, Old Generation e, em algumas implementações, a PermGen (Permanent Generation) ou Metaspace. Essa segmentação ajuda o Garbage Collector a otimizar a coleta de lixo, minimizando o impacto na performance das aplicações.

A interação entre a Java Stack e o Java Heap Space é fundamental para a execução de aplicações Java. Enquanto a Java Stack lida com a execução e o fluxo do programa através de chamadas de método, o Java Heap lida com a alocação dinâmica de memória para objetos e arrays. Essa separação de responsabilidades garante que a JVM possa gerenciar eficientemente a memória necessária para rodar aplicações complexas e de grande escala.

Além disso, o entendimento desses componentes é crucial para desenvolvedores Java, pois decisões de design e otimização de código podem impactar diretamente o uso da memória. Por exemplo, um uso excessivo de memória Heap pode levar a frequentes coletas de lixo, afetando a performance da aplicação. Da mesma forma, a criação exagerada de threads pode sobrecarregar a Java Stack Memory, levando a erros de estouro de pilha.

Figura 2: Divisão da Java Heap Space.

A Java Heap Space é dividida em:

  • Young Generation:
    • É onde os objetos recém-criados começam;
    • É subdividido em Espaço Eden (onde todos os novos objetos se iniciam) e Dois espaços Survivor (onde os objetos são movidos do Eden depois de sobreviverem a um ciclo do garbage collection);
  • Old Generation:
    • É para onde os objetos de longa duração são eventualmente movidos da Young Generation;
  • Permanent Generation:
    • Armazena metadados como classes e métodos;
    • As classes que não estão mais em uso podem ser coletadas desta divisão.

Características-chave da Java Heap Space:

  • É acessado por meio de técnicas complexas de gerenciamento de memória, que incluem:
    • Young Generation;
    • Old Generation; e
    • Permanent Generation;
  • Se o espaço de heap estiver cheio:
    • O Java lançará java.lang.OutOfMemoryError;
  • O acesso à memória é relativamente mais lento que a memória Stack;
  • Não é desalocada automaticamente;
    • Precisa do Garbage Collector para liberar objetos não utilizados de modo a manter a eficiência do uso de memória;
  • Não é threadsafe;
    • Ao contrário da memória Stack;
    • Precisa ser protegida pela sincronização adequada do código.

Espero que tenham gostado! 

Forte abraço e até a próxima jornada!

_________________________

Professor Rogerão Araújo

Quer ficar por dentro dos concursos públicos abertos e previstos pelo Brasil?
clique nos links abaixo:

Concursos Abertos

Concursos 2024

Receba gratuitamente no seu celular as principais notícias do mundo dos concursos!
clique no link abaixo e inscreva-se gratuitamente:

Telegram

Fonte: Gran Cursos Online

Download disponível – Explicando a estrutura da JVM



Baixar apostila para concurso