JVM Arquitectura & Como Funciona?
div> Prabhu Rajendran
/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
- Área de Dados de Tempo de Execução
- Máquina de Execução.
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.
- Bootstrap Class Loader – carrega a classe do caminho da classe bootstrap (rt.jar -high priority)
- Extension Class Loader – carrega a classe que incluiu em (jre/lib).
- 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.
- 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)
- Preparar : Para todas as variáveis estáticas em bytecode , a memória será atribuída e os valores por defeito serão carregados.
- 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
- 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.
- 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.
- Local Variable será armazenada na memória da pilha
- Seguro de linha
- 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.
- 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).
- 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)