logo

Pilha versus pilha Java

Em Java, gerenciamento de memória é um processo vital. É gerenciado por Java automaticamente. A JVM divide a memória em duas partes: pilha memória e memória heap. Da perspectiva de Java, ambas são áreas de memória importantes, mas ambas são usadas para propósitos diferentes. O principal diferença entre memória Stack e memória heap é que a pilha é usada para armazenar a ordem de execução do método e variáveis ​​​​locais, enquanto a memória heap armazena os objetos e usa alocação e desalocação dinâmica de memória. Nesta seção, discutiremos detalhadamente as diferenças entre pilha e heap.

Pilha versus pilha Java

Memória de pilha

A memória da pilha é um espaço físico (em RAM) alocado para cada thread em tempo de execução. Ele é criado quando um thread é criado. O gerenciamento de memória na pilha segue a ordem LIFO (Last-In-First-Out) porque é acessível globalmente. Ele armazena as variáveis, referências a objetos e resultados parciais. A memória alocada para a pilha permanece até que a função retorne. Se não houver espaço para criação dos novos objetos, lança ojava.lang.StackOverFlowError. O escopo dos elementos é limitado aos seus threads. O JVM cria uma pilha separada para cada thread.

Memória de pilha

Ele é criado quando a JVM é inicializada e usado pelo aplicativo enquanto o aplicativo é executado. Ele armazena objetos e classes JRE. Sempre que criamos objetos ele ocupa espaço na memória heap enquanto a referência desse objeto é criada na pilha. Não segue nenhuma ordem como a pilha. Ele lida dinamicamente com os blocos de memória. Isso significa que não precisamos manusear a memória manualmente. Para gerenciar a memória automaticamente, Java fornece o coletor de lixo que exclui os objetos que não estão mais sendo usados. A memória alocada para heap permanece até que qualquer evento, seja programa encerrado ou memória livre, não ocorra. Os elementos são globalmente acessíveis no aplicativo. É um espaço de memória comum compartilhado com todos os threads. Se o espaço de heap estiver cheio, ele lança ojava.lang.OutOfMemoryError. A memória heap é dividida nas seguintes áreas de memória:

  • Geração jovem
  • Espaço do sobrevivente
  • Velha geração
  • Geração permanente
  • Cache de código

A imagem a seguir mostra a alocação de memória de pilha e espaço de heap.

Pilha versus pilha Java

Diferença entre pilha e memória heap

A tabela a seguir resume todas as principais diferenças entre memória de pilha e espaço de heap.

Parâmetro Memória de pilha Espaço de pilha
Aplicativo Armazena itens que têm vida muito curta, como métodos, variáveis, e variáveis ​​de referência dos objetos. Ele armazena objetos e Java Runtime Environment ( JRE ) Aulas.
Encomenda Segue o LIFO ordem. Não segue nenhuma ordem porque é uma alocação dinâmica de memória e não possui nenhum padrão fixo de alocação e desalocação de blocos de memória.
Flexibilidade Isso é não flexível porque não podemos alterar a memória alocada. Isso é flexível porque podemos alterar a memória alocada.
Eficiência Tem mais rápido acesso, alocação e desalocação. Tem Mais devagar acesso, alocação e desalocação.
Tamanho da memória Isso é menor no tamanho. Isso é maior no tamanho.
Opções Java usadas Podemos aumentar o tamanho da pilha usando a opção JVM -Xss. Podemos aumentar ou diminuir o tamanho da memória heap usando as opções -Xmx e -Xms JVM.
Visibilidade ou Escopo As variáveis ​​são visíveis apenas para o thread proprietário. É visível para todos os tópicos.
Geração de Espaço Quando um thread é criado, o sistema operacional aloca automaticamente a pilha. Para criar o espaço de heap para o aplicativo, a linguagem primeiro chama o sistema operacional em tempo de execução.
Distribuição Uma pilha separada é criada para cada objeto. Ele é compartilhado entre todos os threads.
Lançamentos de exceção JVM lança o java.lang.StackOverFlowError se o tamanho da pilha for maior que o limite. Para evitar esse erro, aumente o tamanho da pilha. JVM lança o java.lang.OutOfMemoryError se a JVM não conseguir criar um novo método nativo.
Alocação/Desalocação Isso é feito automaticamente pelo compilador . Isso é feito manualmente pelo programador .
Custo Seu custo é menos . Seu custo é mais em comparação com a pilha.
Implementação Sua implementação é duro . Sua implementação é fácil .
Ordem de alocação A alocação de memória é contínuo . Memória alocada em aleatório ordem.
Segurança de thread É thread-safe porque cada thread tem sua própria pilha. Não é thread-safe, portanto, é necessária a sincronização adequada do código.