Quando uma pessoa começa a aprender Java ou outras linguagens de programação, ela entrará em contato com o heap e a pilha. Como não há uma explicação clara e clara no início, muitas pessoas terão muitas dúvidas. qual é a pilha e qual é a diferença entre heap e stack? O pior é que existe uma pilha em Java, uma estrutura de dados sequencial last-in-first-out (Last In First Out), que é java.util.Stack. Nesse caso, inevitavelmente deixará muitas pessoas mais confusas em relação à questão anterior. Na verdade, o heap e a pilha são partes da memória e têm funções diferentes, e um programa precisa alocar memória nesta área. Como todos sabemos, todos os programas Java são executados dentro da máquina virtual JVM. O que estamos apresentando aqui é naturalmente o heap e a pilha na memória JVM (virtual).
a diferença
A diferença entre heap e pilha em Java é naturalmente uma pergunta comum em entrevistas. Os pontos a seguir são as diferenças específicas.
Todos cumprem suas funções
A principal diferença é que a memória da pilha é usada para armazenar variáveis locais e chamadas de métodos.
A memória heap é usada para armazenar objetos em Java. Quer sejam variáveis de membro, variáveis locais ou variáveis de classe, os objetos para os quais elas apontam são armazenados na memória heap.
Exclusivo ou compartilhado
A memória da pilha pertence a um único thread. Cada thread terá uma memória de pilha, e as variáveis que ele armazena só podem ser visíveis no thread ao qual pertence.
Os objetos na memória heap são visíveis para todos os threads. Objetos na memória heap podem ser acessados por todos os threads.
Erro de exceção
Se não houver espaço disponível na memória da pilha para armazenar chamadas de método e variáveis locais, a JVM lançará java.lang.StackOverFlowError.
E se não houver espaço disponível na memória heap para armazenar o objeto gerado, a JVM lançará java.lang.OutOfMemoryError.
Tamanho do espaço
A memória da pilha é muito menor que a memória heap. Se você usar recursão, sua pilha será preenchida rapidamente. Se a recursão não ocorrer a tempo, é provável que ocorra um problema StackOverFlowError.
Você pode definir o tamanho da memória da pilha com a opção -Xss. A opção -Xms define o tamanho inicial do heap e a opção -Xmx define o tamanho máximo do heap.
Esta é a diferença entre heap e pilha em Java. Se você entender bem esse problema, ele poderá ajudá-lo a resolver problemas de desenvolvimento, analisar a memória heap e o uso da memória de pilha e até mesmo realizar ajustes de desempenho.
Ver valor padrão (atualizado)
Para visualizar o valor padrão do heap, use o código a seguir, onde InitialHeapSize é o tamanho do heap inicial e MaxHeapSize é o valor máximo do heap.
Copie o código do código da seguinte forma:
13:17 $ java -XX:+PrintFlagsFinal -version |
uintx ErgoHeapSizeLimit = 0 {produto}
uintx HeapSizePerGCThread = 87241520 {produto}
uintx InitialHeapSize:= 134217728 {produto}
uintx LargePageHeapSizeThreshold = 134217728 {produto}
uintx MaxHeapSize:= 2147483648 {produto}
versão java "1.8.0_25"
Java(TM) SE Runtime Environment (compilação 1.8.0_25-b17)
VM de servidor Java HotSpot(TM) de 64 bits (compilação 25.25-b02, modo misto)
Verifique o valor padrão da pilha, onde ThreadStackSize é o tamanho da memória da pilha.
Copie o código do código da seguinte forma:
13:21 $ java -XX:+PrintFlagsFinal -versão | grep ThreadStackSize
intx CompilerThreadStackSize = 0 {pd produto}
intx ThreadStackSize = 1024 {produto pd}
intx VMThreadStackSize = 1024 {produto pd}
versão java "1.8.0_25"
Java(TM) SE Runtime Environment (compilação 1.8.0_25-b17)
VM de servidor Java HotSpot(TM) de 64 bits (compilação 25.25-b02, modo misto)
Informações de tradução
Texto original em inglês: http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html.
A tradução foi modificada, organizada e excluída com base no texto original. Se você estiver interessado, pode visitar o texto original. O endereço PS foi bloqueado.