JVM(Máquina Virtual Java) actua como um motor de tempo de execução para executar aplicações Java. JVM é aquele que na realidade chama o método principal presente em código java. JVM é uma parte do JRE(Java Runtime Environment).
Java applications are called WORA (Write Once Run Anywhere). Isto significa que um programador pode desenvolver código Java num sistema e pode esperar que seja executado em qualquer outro sistema compatível com Java sem qualquer ajuste. Tudo isto é possível devido a JVM.
Quando compilamos um ficheiro .java, ficheiros .class(contém código byte) com os mesmos nomes de classe presentes no ficheiro .java são gerados pelo compilador Java. Este ficheiro .class entra em vários passos quando o executamos. Estes passos em conjunto descrevem todo o JVM.
1) Classloader
Classloader é um subsistema de JVM que é utilizado para carregar ficheiros de classe. Sempre que executamos o programa java, este é carregado em primeiro lugar pelo classloader. Existem três classloaders incorporados em Java.
- Bootstrap ClassLoader: É um carregador de primeira classe, que é responsável por carregar ficheiros de classe do rt.jar também chamado runtime jar.
- Extension ClassLoader: É responsável por carregar os ficheiros de classe adicionais da pasta jre lib ext (jre/lib/ext).
- ClassLoader Application ClassLoader: O carregador de classes de aplicação é aquele que carrega os ficheiros de classe a partir do frasco específico da aplicação. Isto não é mais do que a aplicação que criou. Uma vez compilado o seu programa java, o JVM cria ficheiros de classe. O carregador de classes de aplicação carrega estes ficheiros de classe para a área de memória.
Link: Efectua verificação, preparação, e (opcionalmente) resolução.
- Verificação: Assegura a correcção do bytecode.
- Preparação: JVM atribui memória às variáveis de classe e inicializa a memória aos valores por defeito.
- Resolução: É o processo de substituição de referências simbólicas do tipo por referências directas.
Initização
Nesta fase, todas as variáveis estáticas são atribuídas com os seus valores definidos no código e bloco estático
2) Área de Dados de Tempo de Execução
O segundo componente principal na arquitectura JVM é a área de dados de tempo de execução. Tal como um carro precisa de uma estrada, ou como um comboio precisa de uma via férrea para circular, da mesma forma, a JVM precisa de uma área de memória para armazenar os ficheiros de classe e executá-los. Existem 5 tipos de área de dados de memória. São área de métodos, memória Heap, memória Stack, registos de PC, e pilhas de métodos nativos.
- Área de métodos: Todos os dados de classe são armazenados nesta área de memória.
- Área de pilha: Todos os objectos e variáveis de instância são guardados nesta área de memória.
- Área de pilha: Para cada thread, JVM cria uma pilha de tempo de execução que é armazenada aqui.
- RegistoPC: Endereço de armazenamento da instrução de execução actual de um thread.
- pilha de métodos nativos: Pilha de método nativo: Pilha de método nativo contém informação de método nativo.
3) Motor de execução
Motor de execução executa o .class (bytecode). Lê o byte-código linha a linha, utiliza dados e informações presentes em várias áreas de memória, e executa instruções. Pode ser classificado em três partes:-
- Interprete: Compila o byte-código linha a linha e depois executa-o. A desvantagem aqui é que quando um método é chamado várias vezes, cada vez que é necessária interpretação.
- compilador JIT (JIT): É utilizado para aumentar a eficiência do intérprete. Compila todo o bytecode e altera-o para código nativo, pelo que sempre que o intérprete vê repetidas chamadas de método, o JIT fornece código nativo directo para essa parte, pelo que não é necessária a reinterpretação, pelo que a eficiência é melhorada.
li>Garbage Collector: Um objecto já não utilizado é removido pelo colector do lixo.
0 comentários