Java Virtual Machine - Guia de Arquitetura da JVM com seu Componente

Índice:

Anonim

Introdução à Java Virtual Machine

Neste artigo, aprenderemos sobre o Java Virtual Machine, também conhecido como "JVM". Java Virtual Machine é uma máquina virtual que permite que um sistema de computador execute / execute programas Java. Basicamente, a JVM é um mecanismo que funciona como um ambiente de tempo de execução para o código Java. A JVM converte o código java em linguagem de máquina. Quando você executa um arquivo .class compilado, ele acessa a JVM e, em seguida, a JVM retorna a saída. A Java Virtual Machine faz parte do JRE, que significa "Java Runtime Environment". As tarefas básicas para uma Java Virtual Machine consistem em Carregar o código, verifique o código e execute o código. Além disso, forneça o ambiente de tempo de execução para a execução do código. A JVM consiste em vários componentes, como Classloader, Lista de espaço designado pela JVM, como Stack, um Execution Engine e algumas bibliotecas nativas.

A arquitetura da máquina virtual Java

Conforme mostrado na imagem acima, o Java Virtual Machine Architecture consiste em vários componentes. Vamos aprender sobre cada componente específico individualmente.

Carregador

Como o nome sugere, é um componente responsável pelo carregamento de arquivos de classe. Carregar, vincular e inicializar um arquivo de classe são as principais funções do Loader. O carregador funciona em tempo de execução.

  • Carregando: Basicamente, o carregador lê o arquivo .class, gera o código binário e salva em uma área de método. O Bootstrap Classloader, o Extension Classloader e o Application Classloader são os vários ClassLoaders responsáveis ​​pelo carregamento de várias classes.
  • Vinculação: Três funções principais, como Verificação, Preparação e Resolução. Começa com a verificação do arquivo .class. Se a verificação falhar, ocorrerá uma exceção na verificação do tempo de execução. Posteriormente, a memória é alocada para as variáveis ​​com valores padrão. Finalmente, as referências simbólicas da memória são substituídas por referências diretas da área de memória.
  • Inicializando: Esta é uma parte final do ClassLoader. Os valores originais são atribuídos a todas as variáveis ​​estáticas, seguidos pela execução do bloco estático. Esta parte é executada de cima para baixo de uma classe.

Montão

Detalhes de um objeto e variáveis ​​de instância são todos armazenados aqui. É uma área de memória compartilhada, o que significa que os dados armazenados aqui não são seguros para threads.

Exceção no encadeamento "main" java.lang.OutOfMemoryError: espaço de heap Java

Um dos erros mais relacionáveis ​​é a exceção OutOfMemoryError , o que significa que a JVM não pode alocar um objeto na área Heap ou a alocação de memória não pode ser feita para o mesmo objeto.

Pilha

É aqui que uma pilha de tempo de execução separada é criada para cada novo encadeamento. Também conhecida como pilha de tempo de execução, toda vez que um método é chamado, todos os detalhes são armazenados no suporte de tempo de execução correspondente e, após a conclusão do método, esses detalhes são removidos da pilha.

Registradores de PC

Para cada encadeamento único, é criado um registro PC (Contador de Programas) separado, que armazena o endereço da instrução de execução atual que, posteriormente, será atualizada com a próxima instrução. Essa área de memória é bastante pequena e possui tamanho fixo.

Pilha de método nativo

É um de seu próprio tipo de área de memória, que é invocada por um encadeamento e, em seguida, o encadeamento está em um nível totalmente novo, onde as restrições de estrutura e segurança implícitas pelo Java Virtual Machine não estão mais em exercício. Comparada a outras áreas de memória de tempo de execução, a memória ocupada pelas pilhas do método nativo não possui tamanho fixo, sem limitações de incremento ou decremento.

Interface nativa Java

A JNI simplesmente interage com as Bibliotecas de Métodos Nativos mencionadas abaixo, que são de implementação em C, C ++ e fornecem o mesmo ao mecanismo de execução. O acesso direto ao código de montagem é permitido pela JNI. Para uma JVM, Java e Native são os dois tipos de códigos. O JNI estabelece suavemente um link bem definido entre esses dois.

Bibliotecas de métodos nativos

Coleção de bibliotecas nativas, conforme exigido pelo mecanismo de execução.

Mecanismo de Execução

Bem, agora temos o programa java no bytecode, que está sendo atribuído às áreas de dados explicadas acima através de um carregador de classes, e agora o bytecode será executado pelo mecanismo de execução. O Mecanismo de Execução simplesmente lê o bytecode em unidades, como uma máquina que lê linhas de código, uma por uma. O bytecode é um formato legível por humanos, e é por isso que a máquina não pode ler o que possui e precisa ser convertido em um formato legível por máquina, onde os componentes abaixo são utilizados para fins de interpretação.

O Mecanismo de Execução possui três componentes principais, que são: Intérprete, Compilador JIT e um Coletor de Lixo.

1. Intérprete

Simplesmente, executa o bytecode em um método seqüencial. Uma chamada é feita por uma consulta de linha de comando com um arquivo compilado como argumento. O intérprete é bastante rápido na interpretação e execução de comandos um por um, o que acontece mais rapidamente que o compilador JIT para compilar o código.

nome da classe java

Uma classe main () é obrigatória em um arquivo .class compilado.

2. Compilador JIT

Um dos componentes mais importantes do Java Runtime Environment, que aprimora o desempenho do aplicativo Java em tempo de execução. Nenhum outro componente tem mais impacto no desempenho do que o JIT Compiler. Este é um compilador padrão e é ativado quando qualquer método Java é chamado.

3. Coletor de Lixo

Como o nome sugere, ele tem algo a ver com lixo, o Garbage Collector simplesmente procura todos os objetos possíveis disponíveis no espaço de heap da JVM, verifica se está em uso e exclua os não utilizados. Portanto, simplesmente marca os pedaços de memória que estão em uso ou não. Então ele continua varrendo, onde simplesmente remove o objeto marcado. O melhor caso de uso é que não é necessário um sistema de alocação manual de memória, pois o Garbage Collector faz o trabalho de remover automaticamente o espaço de memória não utilizado. Porém, como se trata de uma tarefa automática, nenhum programador tem controle sobre o agendamento de qualquer intervalo de tempo para a limpeza específica de tarefas e requer mais energia da CPU ao procurar por referências de objetos.

Conclusão

Embora não seja obrigatório ter um entendimento claro de como a JVM funciona, para o propósito de escrever código Java, é imensamente útil. Para um desenvolvedor que entende o funcionamento da JVM, ele escreverá um código melhor e otimizado, por mais longo ou complexo que seja o requisito. Além da descrição fornecida aqui, a JVM fornece uma ampla variedade de recursos e tecnologias. Esses recursos podem ser usados ​​para melhorar o desempenho, conforme necessário por um fornecedor específico

Artigos recomendados

Este é um guia para Java Virtual Machine. Aqui discutimos a arquitetura da máquina virtual java junto com seus vários componentes. Você também pode consultar os seguintes artigos para saber mais -

  1. Bubble Classificar em JavaScript
  2. Ciclo de vida do encadeamento em Java
  3. O que é o Java SE?
  4. Melhores compiladores Java
  5. JRE vs JVM | As 8 principais diferenças com (infográficos)