Diferença entre JVM, JRE e JDK

Diferença entre JVM, JRE e JDK

1. Visão geral

Neste artigo, discutiremos as diferenças entre JVM, JRE e JDK considerando seus componentes e usos.

2. JVM

Java Virtual Machine (JVM) é uma implementação de uma máquina virtual que executa um programa Java.

A JVM interpreta primeiro o bytecode. Em seguida, ele armazena as informações da classe na área de memória. Por fim, ele executa o bytecode gerado pelo compilador java.

É uma máquina de computação abstrata com seu próprio conjunto de instruções e manipula várias áreas de memória em tempo de execução.

Os componentes da JVM são:

  • Class Loaders

  • Áreas de dados em tempo de execução

  • Mecanismo de Execução

2.1. Class Loaders

As tarefas iniciais da JVM incluem carregar, verificar e vincular o bytecode. Carregadores de classes lidam com essas tarefas.

Temos um artigo detalhado especificamente sobreclass loaders.

2.2. Áreas de dados em tempo de execução

The JVM defines various memory areas to execute a Java program. Eles são usados ​​durante o tempo de execução e são conhecidos como áreas de dados de tempo de execução. Algumas dessas áreas são criadas na inicialização da JVM e destruídas quando a JVM sai, enquanto outras são criadas quando um encadeamento é criado e destruído quando um encadeamento sai.

Vamos considerar essas áreas uma por uma:

Área do método

Basicamente, a área do método é análoga à área de armazenamento para código compilado. Ele armazena estruturas como pool constante em tempo de execução, dados de campo e método, o código para métodos e construtores, bem como nomes de classe totalmente qualificados. A JVM armazena essas estruturas para cada classe.

A área do método, também conhecida como espaço de geração permanente (PermGen), é criada quando a JVM é inicializada. A memória para esta área não precisa ser contígua. Todos os encadeamentos da JVM compartilham essa área de memória.

Área de Pilha

A JVM aloca a memória para todas as instâncias e matrizes de classe dessa área.

O Garbage Collector (GC) recupera a memória heap para objetos. Basicamente, o GC possui três fases para recuperar a memória dos objetos viz. dois GC menores e um GC importante.

A memória heap possui três partes:

  • Espaço Eden - é uma parte do espaço da Geração Jovem. Quando criamos um objeto, a JVM aloca memória desse espaço

  • Espaço Survivor - também faz parte do espaço da Geração Jovem. O espaço sobrevivente contém objetos existentes que sobreviveram às fases menores do GC

  • Espaço Tenured - também conhecido como espaço Old Generation. Ele contém objetos sobreviventes por muito tempo. Basicamente, um limite é definido para objetos de Geração Jovem e, quando esse limite é atingido, esses objetos são movidos para o espaço de posse.

A JVM cria uma área de heap assim que é iniciada. Todos os encadeamentos da JVM compartilham essa área. A memória da área de heap não precisa ser contígua.

Área de pilha

Armazena dados como quadros e cada quadro armazena variáveis ​​locais, resultados parciais e chamadas de método aninhadas. A JVM cria a área de pilha sempre que cria um novo encadeamento. Esta área é privada para cada segmento.

Cada entrada na pilha é chamada Frame da pilha ou registro de ativação. Cada quadro contém três partes:

  • Matriz de variável local - contém todas as variáveis ​​e parâmetros locais do método

  • Pilha de operandos - usado como um espaço de trabalho para armazenar o resultado do cálculo intermediário

  • Frame Data - usado para armazenar resultados parciais, retornar valores para métodos e referência à tabelaException que fornece informações de bloco de captura correspondentes em caso de exceções

A memória da pilha da JVM não precisa ser contígua.

Registros de PC

Cada encadeamento da JVM possui um PC Register separado, que armazena o endereço da instrução atualmente em execução. Se a instrução atualmente em execução fizer parte do método nativo, esse valor será indefinido.

Pilhas de método nativo

Métodos nativos são aqueles escritos em linguagens diferentes de Java.

A JVM fornece recursos para chamar esses métodos nativos. As pilhas de métodos nativas também são conhecidas como "pilhas C". Eles armazenam as informações do método nativo. Sempre que os métodos nativos são compilados em códigos de máquina, eles geralmente usam uma pilha de métodos nativos para acompanhar seu estado.

A JVM cria essas pilhas sempre que cria um novo encadeamento. E, portanto, os encadeamentos JVM não compartilham esta área.

2.3. Mecanismo de Execução

O mecanismo de execução executa as instruções usando as informações presentes nas áreas de memória. Tem três partes:

Intérprete

Depois que os carregadores de classe carregam e verificam o bytecode, o intérprete executa o bytecode linha por linha. Essa execução é bastante lenta. A desvantagem do intérprete é que, quando um método é chamado várias vezes, toda vez que é necessária nova interpretação.

No entanto, a JVM usa o JIT Compiler para mitigar essa desvantagem.

Compilador Just-In-Time (JIT)

O compilador JIT compila o bytecode dos métodos freqüentemente chamados no código nativo em tempo de execução. Por isso, é responsável pela otimização dos programas Java.

A JVM monitora automaticamente quais métodos estão sendo executados. Depois que um método se torna elegível para a compilação JIT, ele é agendado para compilação no código da máquina. Este método é então conhecido como método quente. Essa compilação no código da máquina acontece em um encadeamento JVM separado.

Como resultado, ele não interrompe a execução do programa atual. Após a compilação no código da máquina, ele roda mais rápido.

Coletor de lixo

Java cuida do gerenciamento de memória usando a Garbage Collection. É um processo de olhar para a memória heap, identificando quais objetos estão em uso e quais não estão e, finalmente, excluindo objetos não utilizados.

GC é um encadeamento daemon. Ele pode ser chamado explicitamente usando o métodoSystem.gc _ () _, no entanto, ele não será executado imediatamente e a JVM decide quando invocar o GC.

2.4. Interface Nativa Java

Ele atua como uma interface entre o código Java e as bibliotecas nativas (C / C ++).

Existem situações em que o Java sozinho não atende às necessidades de seu aplicativo, por exemplo, implementar um recurso dependente da plataforma.

Nesses casos, podemos usar a JNI para ativar a chamada do código em execução na JVM. Por outro lado, ele permite que métodos nativos chamem o código em execução na JVM.

2.5. Bibliotecas nativas

Essas são bibliotecas específicas da plataforma e contêm a implementação de métodos nativos.

3. JRE

Java Runtime Environment (JRE) é um pacote de componentes de software usados ​​para executar aplicativos Java.

Os principais componentes do JRE incluem:

  • Uma implementação de uma Java Virtual Machine (JVM)

  • Classes necessárias para executar os programas Java

  • Arquivos de Propriedade

Discutimos a JVM na seção acima. Aqui vamos nos concentrar nas classes principais e nos arquivos de suporte.

3.1. Classes de bootstrap

Encontraremos classes de bootstrap emjre/lib/. This path is also known as the bootstrap classpath. Inclui:

  • Classes de tempo de execução emrt.jar

  • Aulas de internacionalização emi18n.jar

  • Classes de conversão de caracteres emcharsets.jar

  • Outras

O Bootstrap ClassLoader carrega essas classes quando a JVM é inicializada.

3.2. Classes de extensão

Podemos encontrar classes de extensão emjre/lib/extn/ que atuam como um diretório para extensões para a plataforma Java. This path is also known as extension classpath.

Ele contém bibliotecas de tempo de execução JavaFX emjfxrt.jare dados de localidade para pacotesjava.textejava.util emlocaledata.jar. Os usuários também podem adicionar jars personalizados nesse diretório.

3.3. Configurações de propriedade

A plataforma Java usa essas configurações de propriedade para manter sua configuração. Dependendo de seu uso, eles estão localizados em pastas diferentes dentro de/jre/lib/. Esses incluem:

  • Configurações do calendário nocalendar.properties

  • Configurações de registro emlogging.properties

  • Configurações de rede emnet.properties

  • Propriedades de implantação em/jre/lib/deploy/

  • Propriedades de gerenciamento em/jre/lib/management/

3.4. Outros arquivos

Além dos arquivos e classes mencionados acima, o JRE também contém arquivos para outros assuntos:

  • Gerenciamento de segurança emjre/lib/security

  • O diretório para colocar classes de suporte para applets emjre/lib/applet

  • Arquivos relacionados a fontes emjre/lib/fonts e outros

4. JDK

O Java Development Kit (JDK) fornece ambiente e ferramentas para desenvolver, compilar, depurar e executar um programa Java.

Os principais componentes do JDK incluem:

  • JRE

  • Ferramentas de desenvolvimento

Discutimos o JRE na seção acima.

Agora, vamos nos concentrar em várias ferramentas de desenvolvimento. Vamos categorizar essas ferramentas com base em seu uso:

4.1. Ferramentas básicas

Essas ferramentas são a base do JDK e são usadas para criar e construir aplicativos Java. Among these tools, we can find utilities for compiling, debugging, archiving, generating Javadocs, etc.

Eles incluem:

  • javac – lê as definições de classe e interface e as compila em arquivos de classe

  • java – inicia o aplicativo Java

  • javadoc – gera páginas HTML da documentação da API a partir de arquivos fonte Java

  • apt – encontra e executa processadores de anotação com base nas anotações presentes no conjunto de arquivos de origem especificados

  • appletviewer - nos permite executar miniaplicativos Java sem um navegador da web

  • jar – empacota applets ou aplicativos Java em um único arquivo

  • jdb – uma ferramenta de depuração de linha de comando usada para encontrar e corrigir bugs em aplicativos Java

  • javah – produz cabeçalho C e arquivos de origem de uma classe Java

  • javap – desmonta os arquivos de classe e exibe informações sobre campos, construtores e métodos presentes em um arquivo de classe

  • extcheck – detecta conflitos de versão entre o arquivo Java Archive (JAR) de destino e os arquivos JAR de extensão atualmente instalados

4.2. Ferramentas de segurança

Isso inclui ferramentas de gerenciamento de chave e certificado que são usadas para manipular keystores Java.

Um Java Keystore é um contêiner para certificados de autorização ou certificados de chave pública. Conseqüentemente, é frequentemente usado por aplicativos baseados em Java para criptografia, autenticação e veiculação em HTTPS.

Além disso, eles ajudam a definir as políticas de segurança em nosso sistema e a criar aplicativos que podem funcionar dentro do escopo dessas políticas no ambiente de produção. Esses incluem:

  • keytool – ajuda no gerenciamento de entradas de armazenamento de chaves, ou seja, chaves criptográficas e certificados

  • jarsigner – gera arquivos JAR assinados digitalmente usando informações de armazenamento de chaves

  • policytool –  nos permite gerenciar os arquivos de configuração da política externa que definem a política de segurança da instalação

Algumas ferramentas de segurança também ajudam no gerenciamento de tíquetes Kerberos.

Kerberos é um protocolo de autenticação de rede.

Ele funciona com base em tickets para permitir que os nós que se comunicam em uma rede não segura provem sua identidade entre si de uma maneira segura:

  • kinit – usado para obter e armazenar em cache os tíquetes de concessão de tíquetes Kerberos

  • ktab – gerencia nomes de princípios e pares de chaves na tabela de chaves

  • klist – exibe entradas no cache de credenciais locais e tabela de chaves

4.3. Ferramenta de Internacionalização

Internacionalização é o processo de projetar um aplicativo para que ele possa ser adaptado a vários idiomas e regiões sem alterações de engenharia.

Para isso, o JDK traznative2ascii. . Esta ferramenta converte um arquivo com caracteres suportados pelo JRE em arquivos codificados em ASCII ou escapes Unicode.

4.4. Ferramentas RMI (Remote Method Invocation)

As ferramentas RMI permitem a comunicação remota entre aplicativos Java, proporcionando assim escopo para o desenvolvimento de aplicativos distribuídos.

O RMI permite que um objeto em execução em uma JVM invoque métodos em um objeto em execução em outra JVM. Essas ferramentas incluem:

  • rmic – gera stub, esqueleto e classes de empate para objetos remotos usando o Java Remote Method Protocol (JRMP) ou Internet Inter-Orb Protocol (IIOP)

  • rmiregistry – cria e inicia o registro de objeto remoto

  • rmid – sinicia o daemon do sistema de ativação. Isso permite que os objetos sejam registrados e ativados em uma Java Virtual Machine

  • serialver – retorna UID da versão serial para classes especificadas

4.5. Ferramentas Java IDL e RMI-IIOP

O Java Interface Definition Language (IDL) adiciona o recurso Common Object-Based Request Broker Architecture (CORBA) à plataforma Java.

Essas ferramentas permitem que aplicativos da Web Java distribuídos invoquem operações em serviços de rede remota usando o OMG (Object Management Group) padrão da indústria - IDL.

Da mesma forma, poderíamos usar o Internet InterORB Protocol (IIOP).

RMI-IIOP, isto é, O RMI sobre IIOP permite a programação de servidores e aplicativos CORBA por meio da API RMI. Assim, permite a conexão entre dois aplicativos escritos em qualquer linguagem compatível com CORBA via Internet InterORB Protocol (IIOP).

Essas ferramentas incluem:

  • tnameserv – Serviço de nomenclatura temporário que fornece um diretório estruturado em árvore para referências de objetos

  • idlj – o compilador IDL-para-Java para gerar as ligações Java para um arquivo IDL especificado

  • orbd – clientes sensíveis para localizar e invocar objetos persistentes de forma transparente no servidor no ambiente CORBA

  • servertool – fornece interface de linha de comando para registrar ou cancelar o registro de um servidor persistente com ORB Daemon (orbd), iniciar e desligar um servidor persistente registrado com ORB Daemon, etc.

4.6. Ferramentas de implantação Java

These tools help in deploying Java applications and applets on the web. Eles incluem:

  • pack200 – transforma um arquivo JAR em um arquivopack200 usando o compressor Javagzip

  • unpack200 – transforma o arquivopack200 em um arquivo JAR

4.7. Ferramenta de plug-in Java

O JDK nos fornecehtmlconverter. Além disso, é usado em conjunto com o Java Plug-in.

Por um lado, o Java Plug-in estabelece uma conexão entre navegadores populares e a plataforma Java. Como resultado dessa conexão, os applets no site podem ser executados em um navegador.

Por outro lado,htmlconverter é um utilitário para converter uma página HTML contendo miniaplicativos em um formato para Plug-in Java.

4.8. Ferramenta Java Web Start

JDK trazjavaws. Podemos usá-lo em conjunto com o Java Web Start.

This tool allows us to download and launch Java applications with a single click from the browser. Portanto, não há necessidade de executar nenhum processo de instalação.

4.9. Ferramentas de monitoramento e gerenciamento

These are great tools that we can use to monitor JVM performance and resource consumption. Aqui estão algumas delas::

  • jconsole – fornece um console gráfico que permite monitorar e gerenciar aplicativos Java

  • jps – lista as JVMs instrumentadas no sistema de destino

  • jstat – monitora as estatísticas JVM

  • jstatd – monitora a criação e o encerramento de JVMs instrumentados

4.10. Ferramentas de solução de problemas

These are experimental tools that we can leverage for troubleshooting tasks:

  • info – gera informações de configuração para um processo Java especificado

  • jmap – imprime mapas de memória de objeto compartilhado ou detalhes de memória heap de um processo especificado

  • jsadebugd – anexa a um processo Java e atua como um servidor de depuração

  • jstack – imprime rastreamentos de pilha Java de threads Java para um determinado processo Java

5. Conclusão

Neste artigo, identificamos que a diferença básica entre JVM, JRE e JDK está em seu uso.

Primeiro, descrevemos como a JVM é uma máquina de computação abstrata que realmente executa o bytecode Java.

Em seguida, explicamos como executar aplicativos Java, usamos o JRE.

E, finalmente, entendemos como desenvolver aplicativos Java, usamos o JDK.

Também levamos um tempo para explorar as ferramentas e os conceitos fundamentais desses componentes.