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.
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.
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. |