JVM (Java Virtual Machine - em inglês), que é o ambiente onde os programas escritos em JAVA irão executar, nada mais é do que um programa Java rodando outros programas feitos em JAva, obedecendo à especificação J2EE. Este programa Java recebe o nome de Máquina Virtual Java e é, normalmente chamado de JVM. Quando um programa Java é feito, ele não é capaz de ser executado por um sistema operacional (Windows, Linux, MAC OS ou Unix), porque a linguagem Java não gera um objeto capaz de ser entendido pelo Sistema Operacional. Ao invés, ele gera um código intermediário chamado de pcode, que é entendido e interpretado pela JVM. Veja a figura abaixo:
Figura 1
Quando um programa Java está sendo executado por uma JVM, ele requisita recursos ao processo Java, que por sua vez requisita ao sistema operacional. Imagine que um programa irá gravar um arquivo contendo alguns dados; o programador programa um código para gravar um arquivo e o programa Java irá "pensar" que está gravando um arquivo, quando na verdade quem irá gravar é a JVM. Na mesma linha, o programa Java mostra um conjunto de caracteres na tela, mas ele não tem acesso à placa de vídeo para mostrar os caracteres, na verdade ele dá o comando, mas quem executa é o processo Java (JVM) e não o programa em si. Desta forma existe a ilusão que o programa feito em Java executa todas as ações, mas na verdade que executa as ações é a JVM. Por este motivo o progama fica isolado dentro de um ambiente Java virtual, daí o nome Máquina Virutal Java. Em Inglês Java Virtual Machine, com sua sigla JVM, que é o nome comumente chamado no mercado.
Podemos detalhar ainda mais a Figura 1, pois a Máquina Virtual Java (JVM) é uma arquitetura antiga, concebida por uma empresa chamada Sun Microsystem, comprada pela Oracle. Em meados de 1991 a Sun queria desenvolver um conjunto de instruções que não mudasse com o hardware. Eles utilizaram a sintáxe de uma linguagem muito poderosa e dominante na época, chamada linguagem C++. O Java, como muitos pensam, não é uma linguagem, é uma plataforma, que é capaz de executar uma instrução, independente do hardware onde esteja instalado. Até aquele momento um programa feito para uma arquitetura de hardware e sistema operacional só funcionava naquela arquitetura, caso houvesse uma mudança de Sistema Operacional ou Hardware, o programa deveria ser alterado ou refeito para suportar o novo ambiente. Veja a imagem abaixo:
Figura 2
Observe que na coluna da direita, entre o programa e o Sistema Operacional temos a plataforma Java. Ou seja, o programa só acessa a Plataforma Java, não tem acesso direto às particularidades do Sistema Operacional ou ao Hardware. Desta forma, se o sistema Operacinal mudar ou o Hardware, basta alterar a Plataforma Java, deixando o programa sem alteração. Num olha rápido, logo pensamos: "Dá no mesmo, alterar o programa ou a plataforma Java". O que não é verdade, pois a plataforma Java é apenas uma, basta construir uma outra para um novo sistema operacional ou estender alguma existente. Com o tempo vão existir em muitas empresas milhares de programas diferentes, então é muito melhor mudar uma Plataforma do que milhares de programas.
Com vimos os programas Java são escritos em forma de texto obedecendo uma sintaxe. Este texto é compilado e transformado numa linguegem intermediária, chamada Byte Code. Este byte code é copiado para uma local, onde a JVM consegue ler e executar. Todo programa Java é baseado em classes, então estes arquivos em byte code são são formados por um conjunto de classes. Na JVM existe um recurso chamado Carregador de Clases (do Inglês Class Loader), que é responsável por lêr as classes dos arquivos feito em byte code. Ele deixa as classes disponíveis para JVM, que, ao executar uma operação, traduz o byte code para o sistema operacional através de um conjunto de rotinas chamados de Sistema de tempo de execução (Runtime). O runtime transforma o byte code num conjunto de instruções em binário, de forma que o sistema operacional possa entender. Veja a figura abaixo:
Figura 3
Esta arquitetura permite que, quando um novo sistema operacional é criado ou um novo hardware, a Sun criava um novo runtime e disponibilizada para download. Desta forma os programas feitos em Java passaram a ser portáveis (podem rodar em vários tipos de hardware e sistemas operacionais sem a necessidade de alteração). Comumente as JVM são chamadas de servidores (Servidores Java) e os Hardware, que era chamado de servidor, passou a ser chamado de máquina. Embora cada profissional utilize de uma forma). Para evitar confusões, será chamada de servidor as JVM e os Hardware de máquina.
Num ambiente corporativo é muito comum que tenhamos vários servidores espalhados em várias máquinas, eles podem atuar de forma independente ou podem ser agrupados para trabalhar em grupo, o que permite um aumento na disponibilidade da aplicação, e também permite que seja tolerânte a falhas. Este grupo de servidores, agindo como se fossem apenas um é denominado de Cluster.
Podemos exetuar vários programas numa JVM ou apenas um. Depende da necessidade e da organização da empresa. Também é possível rodar um mesmo programa em várias JVM. Na mesma linha podemos rodar uma ou mais JVM num mesmo hardware ou em vários. Perceba que as possibilidades são muitas. Veja o exemplo abaixo (figura simplificada, para facilitar o entedimento):
Figura 4
Esta foi a primeira parte, que tentou exemplificar o que é uma JVM, agora veja a segunda parte, que irá mostrar como ela funciona internamente.