Articles

JVM Arquitectura & Como Funciona?

div> Prabhu Rajendran

Follow

div> Mar 28, 2019 – 3 min read

/div>

Every Java Developer Knows bytecode é executado pelo JRE , mas JRE é a implementação de JVM. “que analisa o bytecode,interpreta o código e executa-o”.

Virtual Machine é uma implementação de software de máquina física.Java foi desenvolvido com o conceito de WORA (Write Once Run Anywhere).O compilador compila o ficheiro java em ficheiro de classe , depois o ficheiro .class é introduzido no JVM que o carrega e executa.

Como funciona o JVM?

    li> Subsistema de Carregador de Classes

  1. Área de Dados de Tempo de Execução
  2. Máquina de Execução.
div>>

>

p> Now, Vamos saltar para cada parte.

1.Class Loader SubSystem :

Java Dynamic Class loading functionality is handled by class loader subsystem. “Load -> Link -> Inicializar o ficheiro de classe” pela primeira vez em tempo de execução.

1.1. Carregamento : As classes serão carregadas por este componente.

  1. Bootstrap Class Loader – carrega a classe do caminho da classe bootstrap (rt.jar -high priority)
  2. Extension Class Loader – carrega a classe que incluiu em (jre/lib).
  3. Application Class Loader – carrega a classe de nível de aplicação.

1.2 Ligação : Executa a Verificação,Preparação e Resolução na Classe carregada.

  1. Verificar : O verificador Bytecode verificará se o bytecode gerado é adequado ou não , caso contrário obteremos o Erro de Verificação(java.lang.VerifyError)
  2. Preparar : Para todas as variáveis estáticas em bytecode , a memória será atribuída e os valores por defeito serão carregados.
  3. Resolve(Opcional): As referências simbólicas de classe serão substituídas por referências originais da área do método.

1.3 Inicialização : Fase final do carregador de classes , aqui todas as variáveis estáticas serão atribuídas a valores originais & bloco estático é executado.

2. Runtime Data Area : (JVM Memory) – dividido em 5 componentes

  1. Method Area : isto irá armazenar todos os dados de nível de classe (campos, método,variável estática). Apenas uma área de método por JVM.
  2. Heap Area : todos os objectos & instância correspondente , variável , array serão armazenados. Um Heap por JVM
  • onde Heap & Área do Método não são seguros para o recurso partilhado para JVM

3. Área da Pilha : para cada nova pilha de fios em tempo de execução será criada uma nova pilha. para cada chamada de método, será adicionada uma entrada na pilha chamada stack frame.

  1. Local Variable será armazenada na memória da pilha
  2. Seguro de linha
  3. Stack Frame é dividido em três sub-entidades:

3.1 Local Variable Array: relacionado com o método local , as variáveis são invloved

3.2 Operand Stack : Operação Intermédia – actua como espaço de trabalho em tempo de execução para executar a operação

3.3 Frame Data : todos os símbolos correspondentes ao método serão armazenados, em caso de qualquer excepção, a informação do bloco de captura será mantida.

4. Registos de PC: Cada Thread terá um registo que armazena a actual operação de execução.(uma vez cada actualização de instrução , o registo do PC também actualizará a próxima instrução)

5. Pilha do Método Nativo: Armazena informação do método nativo para cada thread.

3. Motor de Execução: O código byte que é atribuído na área de dados em Tempo de Execução será executado.

  1. Interpreter: Interpreta o bytecode mais rapidamente mas a execução é lenta.(um método é chamado várias vezes é necessário criar uma nova Interpretação).
  2. JIT Compiler : neutraliza a desvantagem de interpretar.sempre que encontrar código repetido, utiliza o JIT Compiler.

Compila o bytecode em código nativo (o código nativo será utilizado directamente para chamadas de métodos repetidos).

Gerador de código intermédio: Gera código intermédio sempre que necessário

Optimizador de código: Optimizar o código

Gerador de código alvo : Converte para máquina / Código nativo

Profiler: Ajuda a encontrar as chamadas de múltiplos métodos (encontrar hotspots)

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *