1. Visão geral
A máquina virtual Java dividirá a memória que gerencia várias áreas de dados no processo de execução do programa Java. A memória gerenciada pela Java Virtual Machine incluirá as seguintes áreas de dados de tempo de execução, conforme mostrado na figura abaixo:
O seguinte é explicado em todas as áreas.
Segundo, o contador de programas da área de dados <Br /> <BR /> pode ser considerado como um indicador de número de linha do código de bytes executado pelo thread atual. No modelo conceitual da máquina virtual, o trabalho de interpreciação do código de trabalho é selecionar as instruções de código de bytes que precisam ser executadas alterando os valores do contador do programa. A recuperação de threads e outras funções básicas devem estar confiando nesse balcão para concluir.
No Thread, para permitir que o thread retorne à posição de execução correta, cada thread precisa ter um programador independente.
Quando o thread está sendo executado é um método Java, esse contador registra o endereço da instrução de código de byte virtual que está sendo executada;
Esta área de memória é a única área que não especifica nenhum OrofMemoryError.
Pilha de máquina virtual java
A pilha de máquina virtual Java também é privada e seu ciclo de vida é o mesmo que os threads. A pilha da máquina virtual descreve o modelo de memória executado pelo método Java: cada método criará um quadro de pilha para armazenar tabelas variáveis locais, operar pilhas, listas dinâmicas vinculadas, informações de exportação de método etc. Do processo de chamada até que o processo de conclusão seja chamado, ele corresponde ao processo de inserir a pilha em uma pilha de máquina virtual na pilha.
Na tabela variável local, vários tipos de dados básicos (boolean, byte, char, curto, flutuante, longo, duplo), referências de objetos e tipos de retorno -address são armazenados no compilador.
Se você não puder solicitar memória suficiente durante a extensão, a exceção do OrofMemoryError será lançada.
A pilha de métodos locais <BR /> Método local é semelhante à máquina virtual. . Algumas máquinas virtuais combinam diretamente a pilha de métodos locais e a pilha de máquina virtual em uma.
Jogará StackOverflowerRor e OutfMemoryError anormalidades.
Pilha de java
A pilha Java é uma área de memória compartilhada por todos os threads.
A pilha Java é a principal área do gerenciamento de coletores de lixo. Como o colecionador é basicamente usado para a divisão de algoritmos de reciclagem, a pilha Java também pode ser subdividida como: a nova geração e a velhice. Do ponto de vista da distribuição da memória, a pilha Java Shared Thread pode dividir vários threads Buffer distribuído em particular (TLAB).
A pilha Java pode estar em um espaço de memória descontínuo físico, desde que seja logicamente contínuo. Em termos de implementação, ele pode não apenas obter tamanho ou extensão fixo.
Se não houver alocação de instância de conclusão da memória na pilha e a pilha não puder ser concluída, o OrofMemoryError será descartado.
Área de método
A área do método é uma área de memória compartilhada por vários threads.
Relativamente falando, os comportamentos de coleta de lixo raramente apareceram nesta área, mas não existe permanentemente na área de métodos de entrada de dados.
Quando a área do método não pode atender às necessidades da distribuição da memória, o OrofMemoryError será expulso.
Correndo piscina constante:
Faz parte da área do método, usada para armazenar vários tipos e referências de símbolo geradas pelo período de compilação.
Memória direta
A memória direta não faz parte da área de dados quando a máquina virtual está em execução.
A alocação de memória direta não será limitada pelo tamanho da pilha de Java, mas será limitada pelo tamanho da memória e também pode lançar uma exceção ou exceção do OrofMemoryRerror.
Terceiro, o processo de criação, layout e acesso de objetos
Criação de objetos
Criar um objeto geralmente requer a nova palavra -chave. Se o processo de carregamento de classe correspondente for executado.
Depois que a aula é carregada, a máquina virtual alocará memória para novos alunos. A tarefa de alocar espaço para o objeto é equivalente a dividir um pedaço de memória determinado pelo tamanho da pilha Java. Há duas maneiras de alocar: uma é chamada de colisão de ponteiro. Suponha que a memória na pilha Java seja absolutamente regular. Outro nome é a lista vazia: se a memória na pilha Java não for regular, a máquina virtual precisará manter uma lista, qual registra qual bloco de memória está disponível. Instância do objeto. Qual método de distribuição é determinado se a pilha Java é regulada e se a pilha Java é determinada se o coletor de lixo é usado com compressão e função organizacional. Outro problema que precisa ser considerado é o problema de segurança do thread quando o objeto cria. de memória (TLAB) na pilha Java.
Após a conclusão da distribuição da memória, a máquina virtual precisa inicializar o espaço de memória distribuído com valor zero. Esta etapa garante que o campo da instância do objeto possa ser usado diretamente no código Java sem o valor inicial.
Em seguida, a máquina virtual precisa definir as configurações necessárias, como qual classe desse objeto é a instância da classe, como encontrar as informações de metadados da classe etc. Essas informações são armazenadas no chefe do objeto do objeto.
Após a conclusão do trabalho acima, um novo objeto foi gerado a partir da perspectiva da máquina virtual. No entanto, da perspectiva do programa Java, o método init também é necessário para inicializar o objeto de acordo com os desejos do programador.
Layout de memória do objeto
Na máquina virtual do hotspot, o layout dos objetos na memória pode ser dividido em três partes: cabeça de objeto, dados da instância e preenchimento de alinhamento.
A cabeça do objeto inclui duas partes: a primeira parte é usada para armazenar os dados do próprio objeto, como o código de hash, a idade do envelhecimento do GC e as fechaduras mantidas pelos threads. O funcionário é chamado de "Mark Word". A segunda parte é o ponteiro do tipo, ou seja, o ponteiro do objeto para os dados do metad da classe, e a máquina virtual determina qual classe desse objeto é por este ponteiro.
Os dados da instância são uma informação eficaz armazenada no objeto e também é uma variedade de conteúdo de campo definido no código do programa.
O preenchimento de alinhamento não existe necessariamente, apenas desempenha o papel do caráter de ocupação. , O Hotpot VM exige que o endereço inicial do objeto seja um múltiplo inteiro de 8 bytes. alinhamento.
Posicionamento de acesso ao objeto
O programa Java opera o objeto específico na pilha através dos dados de referência na pilha. Os principais métodos de acesso são dois tipos: manuseio e ponteiro direto:
Equipe: Java Heaps desenhará um pedaço de memória como pool de identificadores. Como mostrado na figura:
Ponteiro direto: o layout do objeto Java Pile deve considerar como colocar as informações relevantes dos dados do tipo do tipo de acesso, e o endereço do objeto é armazenado na referência. Como mostrado na figura:
Os dois métodos têm suas próprias vantagens um gasto de tempo para o posicionamento do ponteiro.
O exposto acima é todo o conteúdo deste artigo.