Olá Pessoal, tudo bom?
Feliz 2016! Que esse ano seja melhor que 2015 e pior que 2017 😀
Voltando as atividades normais, no artigo de hoje iremos descrever sobre a arquitetura da Java Virtual Machine. Essa arquitetura irá puxar alguns conceitos sobre arquitetura de sistemas operacionais, assim termos desconhecidos podem surgir no contexto desse artigo. Peço nesses casos que me envie comentários a respeito desses termos, para que eu possa complementar o artigo e responder suas duvidas.
Compilação X Interpretação
Quando falamos no post sobre a arquitetura da Linguagem Java, foi descrito que uma linguagem como C ou C++ existe um compilador, que é específico para cada Sistema Operacional, o qual transforma o código fonte em um arquivo com poder de execução dentro daquele Sistema, ou seja, esse arquivo é auto suficiente.
Outro problema aqui é a portabilidade, pois um arquivo gerado por um compilador do windows não poderá ser executado em um ambiente Linux. Além disso cada compilador pode ainda gerar um arquivo compatível com determinada família de processadores como Intel x86, SPARC. Assim mesmo que o compilador esteja nas conformidades para um Sistema Operacional, pode não estar OK para uma determinada família de processadores.
Assim os desenvolvedores da Linguagem Java perceberam essa falha e dividiram a Linguagem em duas partes. A primeira um compilador que gera arquivos no formato .class, byte codes, para serem interpretados por uma máquina abstrata. Essa máquina, chamada de Java Virtual Machine, é quem realiza o trabalho de interpretação desses byte codes e realiza o processo negocial com o Sistema Operacional. O ponto aqui é que cada JVM é criada exclusivamente para cada sistema operacional. Assim é possível você gerar um programa, disponibilizá-lo na internet e outras pessoas que possuam a JVM instalada poderão executar o seu programa, independente do sistema operacional que essa pessoa utilize.
Assim as funcionalidades de impressão de texto no vídeo, recepção de caracteres a partir de um teclado, recepção de eventos do mouse ou touch screen, entre muitas outras são encapsuladas dentro de um pedaço da JVM, o qual é reescrito para cada sistema operacional acionando assim as devidas chamadas ao Sistema Operacional, syscalls.
Uma característica, que muitos apontam como desvantagem é que a interpretação desses byte codes não é realizada diretamente pelo processador da maquina física, pois o byte code é rodado através da JVM, a qual realiza a interpretação do código e somente após essa interpretação é que ela emite códigos que serão processados pelo hardware da máquina real. Atualmente a JVM não interpreta 100% do código, visto que a interpretação é um processo demorado e lento. Assim, há um amalgama entre interpretação e compilação, o que permite uma execução de programas Java um pouco mais rápida.
Java Virtual Machine – O que é?
- Uma Documentação onde as funcionalidades da JVM são especificadas. Mas isso não implica que o criador da nova JVM tenha que implementar determinado algoritmo. A implementação base é atualmente patrocinada pela Oracle.
- Uma Implementação sendo conhecida como JRE (Java Runtime Environment).
- Instância de execução em qualquer lugar que for executada uma classe Java, uma instância da JVM é criada.
Java Virtual Machine – Áreas
Ao executar um programa Java, ocorre dentro do sistema operacional a criação de um novo processo. Esse processo conterá uma nova instância da JVM, que irá executar um programa java, que está armazenado em bytecodes gerados pelo compilador. Durante essa execução ocorrerão muitas trocas de informações entre o processo JVM e o Sistema Operacional através de syscalls (Chamadas do Sistema).
Para que todo esse processo possa ocorrer normalmente, a especificação da JVM define uma arquitetura interna para a execução de programas Java. A fim de uma compreensão mais rápida mas não totalmente profunda, observe a Figura 01.
A Figura mostra uma abstração em alto nível dessa arquitetura. Dentro da JVM existem 3 componentes, Class Loader, Execution Engine e Runtime Data Areas. Explicando rapidamente o componente Class Loader obtém os bytecodes do seu projeto e os bytecodes da API do Java e realiza o carregamento dessas informações para o componente Runtime Data Areas, o qual é a memória do Processo, armazenando as informações internas a execução.
Por fim, com tudo carregado o componente Execution Engine é chamado para iniciar o programa Java dentro da JVM. Normalmente esse método inicial é o main(String[]). Esse componente de execução é quem realiza a comunicação com o Sistema Operacional através de chamadas do sistema ou SysCalls. Dessa forma, esse componente deverá ser implementado de acordo com o Sistema Operacional sendo específico para cada plataforma.
finnaly{
Nos próximos artigos estarei dissecando um pouco mais sobre esses componentes internos da JVM, não perca!
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leonardo Ribeiro Marin says
Excelente artigo! Recentemente um colega de escritório que não é desenvolvedor me questionou ” como o Java funciona?” Expliquei rapidamente sobre a arquitetura da JVM. Vou passar este artigo para ele. = )
Mauda says
Olá Leonardo, tudo bom?
Legal! Em breve estarei publicando artigos sobre as outras partes da JVM! Vai acompanhando!
Precisando estamos aqui!
Abs
Mauda