O diretório é o seguinte:
Primeiro, olhe o diagrama de estrutura JVM: Para
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!
A camada inferior é chamar o método start0 , e então clicamos no método start0 para ver como escrever.
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:
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
Apenas entenda!
Área de método
Apenas entenda!
Pilha
Primeiro, olhe para a figura abaixo: O que
é 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?
Se você não entende o texto acima, pode olhar para a seguinte imagem:
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
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:
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 :
o conceito de área permanente:
a diferença entre a geração permanente e o meta-espaço: A
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:
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
combinado com o código acima para visualizar os parâmetros do heap é o seguinte: A
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.
Um erro será relatado: java.lang.OutOfMemoryError
Lanç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,
observe a figura abaixo e combine com a figura acima para entender: Os
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.