Prefácio
A área de memória Java é composta principalmente por contadores de programas, pilhas de máquina virtual Java, pilhas de métodos locais, montes de java, áreas de método e pools constantes de tempo de execução. Este artigo apresentará detalhes sobre a divisão e as exceções das áreas de memória Java. Não vou dizer muito abaixo, vamos dar uma olhada na introdução detalhada juntos.
Área de dados de tempo de execução
Quando a JVM executa programas Java, ela divide a memória em várias áreas de dados diferentes.
Contador de programas
Tópico privado. Pode ser considerado um indicador de número de linha do bytecode executado pelo encadeamento atual. O trabalho do intérprete de bytecode é ler a próxima instrução de bytecode a ser executada alterando esse valor de contagem.
O multithreading é alcançado com troca de threads por sua vez e alocando o tempo de execução do processador. A qualquer momento, um kernel só pode executar instruções em um thread. Para restaurar a posição de execução correta após a comutação do encadeamento, cada encadeamento precisa de um contador de programa independente. Foi isso que mencionei no início de "Thread Private". Se o método que o encadeamento está executando é um método Java, o contador registra o endereço de instrução do bytecode da máquina virtual; Se for um método nativo, o valor do contador está vazio. O contador do programa é a única área em que nenhuma situação de OOM (outOfMemoryError) é especificada na especificação da máquina virtual Java.
Pilha de máquina virtual java
Os tópicos são privados, com o mesmo ciclo de vida que os threads. A pilha Java Virtual Machine descreve o modelo de memória dos métodos Java: cada método criará um quadro de pilha quando for executado, armazenando tabelas de variáveis locais, pilhas de operando, links dinâmicos e informações de saída do método. Da chamada até o final, cada método corresponde ao processo de entrada e saída da pilha deste quadro de pilha na pilha da máquina virtual. A tabela variável local salva vários tipos de dados básicos (int, duplo, char, byte, etc.), referência de objeto (não o próprio objeto) e o tipo de retorno (apontando para um endereço de bytecode).
Duas possíveis exceções nesta área:
Pilha de métodos locais
A pilha de máquina virtual acima executa serviços de método Java para a JVM, e o método local executa o serviço nativo. Outros são semelhantes à pilha de máquinas virtuais, e o StackOverflowerRor e o OrofMemoryError também serão lançados.
Heap Java
O comumente chamado de "memória da pilha" e "memória da heap", o primeiro refere -se à pilha de máquinas virtuais, e o último se refere à pilha de Java. A pilha Java é compartilhada por threads. Criado quando a máquina virtual inicia.
O papel do heap java é armazenar instâncias de objetos. A pilha Java pode estar em um espaço de memória fisicamente descontínua e requer apenas logicamente contínuo.
Área de método
A área compartilhada por threads. Armazena dados como informações de classe, constantes, variáveis estáticas, código compilado pelo compilador etc. que foram carregados pela máquina virtual. Quando a área do método não pode atender aos requisitos de alocação de memória, um OrofMemoryError é lançado.
Pool constante de tempo de execução
O pool constante de tempo de execução faz parte da área do método. C é usado para armazenar várias constantes literais e referências simbólicas geradas durante o período de compilação e serão armazenadas no pool constante de tempo de execução que entra na área do método após o carregamento da classe. O idioma Java não exige que as constantes sejam geradas apenas durante o período de compilação. Em outras palavras, novas constantes podem ser colocadas durante o período de execução.
Memória direta
A memória direta não faz parte da área de dados de tempo de execução da máquina virtual, nem é uma área de memória. A alocação da memória direta da máquina nativa não será limitada pelo tamanho da pilha Java, mas é a memória, afinal. Se a soma de cada área de memória for maior que o limite de memória física, um OrofMemoryError ainda aparecerá.
Processo de criação de objetos
A máquina virtual encontra uma instrução "nova":
Layout de memória de objetos
O layout dos objetos armazenados na memória pode ser dividido em 3 áreas:
Cabeçalho do objeto: armazena os próprios dados de tempo de execução do objeto, como código de hash, idade de geração GC, sinalizador de status de bloqueio, bloqueio mantido por threads, ID de encadeamento tendencioso, etc. Outra parte é um ponteiro de tipo, ou seja, um ponteiro para os metadados da classe do objeto. A máquina virtual usa esse ponteiro para determinar a qual instância da classe a qual o objeto pertence.
Dados da instância: as informações verdadeiramente válidas do objeto, o conteúdo de vários tipos de campo definidos no programa;
Suplemento de alinhamento: não essencial, o papel dos ocupantes.
Posicionamento de acesso ao objeto
Os programas Java operam objetos de instância na pilha através de referências na pilha. por exemplo
Pessoa p = nova pessoa ();
Aqui P é uma referência, e o objeto de pessoa produzido por New é uma instância.
Esta referência não especifica como localizar e acessar a localização específica dos objetos na pilha. Existem dois métodos de acesso convencional:
lidar. Um pedaço de memória será dividido na pilha Java como um pool de identificadores, que faz referência ao endereço do identificador do objeto, e o identificador contém os dados da instância do objeto e os dados do tipo. A vantagem é que, quando o objeto é movido, você só precisa alterar o endereço no identificador e a própria referência não precisa ser modificada.
Ponteiro direto. O endereço do objeto é diretamente armazenado na referência. A vantagem é que a velocidade é mais rápida e, como a referência representa diretamente o endereço do objeto de instância, uma operação de posicionamento do ponteiro é salva. É exatamente assim que o hotspot da Sun usa.
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.