Uma breve análise da área de dados durante a execução da JVM e um entendimento profundo da pilha e heap

Primeiro, olhe o diagrama de estrutura JVM: Para
Insira a descrição da imagem aqui
uma visão geral do carregador de classes, consulte este blog: Carregador semelhante a JVM

Claro, antes de explicar o heap e a pilha, vamos primeiro entender para que outras áreas da área de dados de tempo de execução são usadas:

Pilha de método nativo

A pilha de método local atende ao método local. A linguagem, o uso e a estrutura de dados do método na pilha de método local não são obrigatórios na especificação da máquina virtual, portanto, a máquina virtual específica pode implementá-lo livremente.
Aqui está um exemplo. Thread thread = new Thread(); thread.start();
Acredito que você deve estar familiarizado com este código. Crie um thread e chame seu método de início. A seguir, vamos clicar no código-fonte do método de início!
Insira a descrição da imagem aqui
A camada inferior é chamar o método start0 , e então clicamos no método start0 para ver como escrever.
Insira a descrição da imagem aqui
Podemos ver que este método é modificado pelo método nativo, que na verdade não é um método da linguagem Java.
A figura a seguir ajuda a entender a função da pilha de métodos locais:
Insira a descrição da imagem aqui
portanto, podemos simplesmente entender que a pilha de métodos locais armazena métodos modificados nativos (métodos que chamam a interface), assim como o método start0 no exemplo acima.

Registro do PC

Insira a descrição da imagem aqui
Apenas entenda!

Área de método

Insira a descrição da imagem aqui
Apenas entenda!

Pilha

Primeiro, olhe para a figura abaixo: O que
Insira a descrição da imagem aqui
é armazenado na pilha são 8 variáveis ​​de tipo básico + variáveis ​​de referência de objeto + métodos de instância são alocados na memória da pilha da função. A
seguir, vamos entender o que é um frame de pilha:

Stack frame : pode ser simplesmente entendido como um método em java. Colocá-lo na pilha é chamado de stack frame. Então, o que está escrito no stack frame?
Insira a descrição da imagem aqui
Se você não entende o texto acima, pode olhar para a seguinte imagem:
Insira a descrição da imagem aqui
o método add é chamado no método principal, e o método de instância mencionado antes é colocado na pilha, então o mian é colocado primeiro, seguido pelo método add e as variáveis ​​locais do método add, etc., Todos são armazenados na estrutura de pilha.
Com a descrição acima, não é difícil entendermos o princípio de funcionamento da pilha, conforme mostrado na figura abaixo: Depois de
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
entender a breve análise da pilha acima, vamos dar uma olhada neste erro (Erro) : java.lang.StackOverflowError, Estouro da pilha, agora podemos entender se um Se a função chama a si mesma recursivamente sem terminar, ela continuará se adicionando à pilha até que a pilha java esteja cheia!

amontoar

Heap : para a maioria dos aplicativos, o heap java é a maior parte da memória gerenciada pela máquina virtual java. O heap Java é uma área de memória compartilhada por todos os encadeamentos e é criado quando a máquina virtual é iniciada. O único propósito desta área de memória é armazenar instâncias de objetos, e quase todas as instâncias de objetos alocam memória aqui.
A seguir , vamos dar uma olhada em uma breve análise do heap:
Insira a descrição da imagem aqui
física e logicamente novos alunos vão para a área de + aposentadoria.
Observe que após JDK 1.8, a área permanente se torna um metaespaço!

A figura a seguir é uma breve análise da área recém - nascida :
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
o conceito de área permanente:
Insira a descrição da imagem aqui
a diferença entre a geração permanente e o meta-espaço: A
Insira a descrição da imagem aqui
seguir, falarei sobre o ajuste dos próximos parâmetros de heap (ou seja, ajuste de JVM):
Você pode visualizar os parâmetros de heap por meio do seguinte código:
Insira a descrição da imagem aqui
código mostrado abaixo:

long maxMemory = Runtime.getRuntime().maxMemory();//返回Java虚拟机试图使用的最大内存量。
           Long totalMemory = Runtime. getRuntime().totalMemory();//返回Java虚拟机中的内存总量。
           System.out.println("MAX_MEMORY ="+maxMemory +"(字节)、"+(maxMemory/(double)1024/1024) + "MB");
           System.out.println("TOTAL_ MEMORY = "+totalMemory +"(字节)"+(totalMemory/(double)1024/1024) + "MB");

Como definir os parâmetros por meio da ideia e visualizar os detalhes? O resultado da impressão de
Editar-> Editar Configurações
Insira a descrição da imagem aqui
combinado com o código acima para visualizar os parâmetros do heap é o seguinte: A
Insira a descrição da imagem aqui
seguir, vamos ver o erro de que o heap está estourando, se usarmos o método acima para alocar um pequeno pedaço de memória para o heap da JVM.
Insira a descrição da imagem aqui
Um erro será relatado: java.lang.OutOfMemoryErrorLançado quando a máquina virtual Java não puder alocar um objeto devido à memória insuficiente e o coletor de lixo não tiver mais memória disponível.

A relação entre pilha, heap e área de método

Primeiro, observe a figura abaixo. Os metadados da classe representam o modelo da classe no método (a letra da estrutura da classe). Em seguida,
Insira a descrição da imagem aqui
observe a figura abaixo e combine com a figura acima para entender: Os
Insira a descrição da imagem aqui
novos p1 e p2 são armazenados na pilha. Este é um tipo de referência. Os novos objetos Person são armazenados no heap e esses objetos são obtidos da área de método das informações de estrutura da classe.

Acho que você gosta

Origin blog.csdn.net/Pzzzz_wwy/article/details/106609188
Recomendado
Clasificación