| HotSpot | |
|---|---|
| Desenvolvedores | HotSpot Group, OpenJDK |
| Lançamento inicial | abril de 1999 |
| Repositório | Código-fonte |
| Escrito em | C++ |
| Tipo | Máquina virtual Java |
| Licença | GPLv2 |
| Website | Página no OpenJDK |
HotSpot, também denominada Java HotSpot Virtual Machine, é uma implementação da Máquina Virtual Java (JVM) que integra o OpenJDK. Seu desenvolvimento e manutenção são coordenados pelo HotSpot Group, grupo da comunidade OpenJDK responsável pelo projeto, implementação e evolução da máquina virtual.
O HotSpot utiliza um interpretador de bytecodes combinado com compilação just-in-time (JIT), otimização adaptativa, gerenciamento automático de memória e diferentes coletores de lixo. A implementação é utilizada no Oracle JDK e em distribuições baseadas no OpenJDK.
A tecnologia HotSpot foi lançada pela Sun Microsystems em abril de 1999. Seu desenvolvimento buscava melhorar o desempenho de aplicações Java por meio de técnicas que ultrapassavam a simples compilação imediata de todos os métodos executados.
O nome HotSpot deriva da estratégia de identificar, durante a execução, os pontos do programa utilizados com maior frequência. Esses trechos, denominados hot spots, recebem prioridade para compilação e otimização, enquanto o código pouco executado pode continuar sendo interpretado.
Nas versões antigas da plataforma Java, o HotSpot era disponibilizado em diferentes configurações. A máquina virtual cliente priorizava o tempo de inicialização e o menor consumo de memória, enquanto a versão para servidores priorizava o desempenho após um período maior de execução. Também existiu uma configuração mínima destinada a sistemas com recursos limitados. Nas versões posteriores ao Java 8, apenas a implementação para servidores foi mantida.
O código-fonte do HotSpot integra atualmente o repositório principal do JDK. Sua maior parte é escrita em C++, com componentes específicos para diferentes sistemas operacionais e arquiteturas de processadores.
Ao iniciar uma aplicação, o HotSpot utiliza um interpretador para executar os bytecodes Java. Durante a execução, a máquina virtual coleta informações sobre os métodos utilizados, os caminhos percorridos pelo programa e outros aspectos de seu comportamento. Os trechos identificados como relevantes para o desempenho podem então ser compilados em código nativo.
A implementação inclui dois compiladores JIT principais:
Na compilação em níveis ou tiered compilation, os métodos podem passar por diferentes níveis de execução e otimização. O C1 é utilizado inicialmente para produzir código nativo e coletar informações de perfil; métodos que permanecem relevantes podem ser posteriormente recompilados pelo C2 com otimizações adicionais. Essa abordagem procura conciliar menor tempo de inicialização com melhor desempenho durante a execução prolongada.
Entre as otimizações empregadas pelo HotSpot estão a expansão de chamadas de métodos no próprio código chamador, conhecida como inlining, e transformações orientadas pelas informações coletadas durante a execução. Algumas otimizações podem ser desfeitas quando as condições presumidas pelo compilador deixam de ser válidas.
O HotSpot administra automaticamente o heap utilizado pelos objetos Java e inclui diferentes algoritmos de coleta de lixo. Cada coletor apresenta características distintas em relação à duração das pausas, uso de processadores, consumo de memória e capacidade de processamento.
Entre os coletores disponíveis estão:
O OpenJDK também desenvolve o Shenandoah, coletor que executa parte significativa do trabalho simultaneamente à aplicação para reduzir a duração das pausas. O projeto é patrocinado pelo HotSpot Group.
O recurso Class Data Sharing (CDS) permite armazenar dados processados de classes Java em um arquivo compartilhado. Durante a inicialização, esse arquivo pode ser mapeado na memória, reduzindo o tempo necessário para carregar classes e permitindo que diferentes processos da máquina virtual compartilhem metadados somente para leitura.
O Application Class-Data Sharing amplia o mecanismo para incluir classes selecionadas das próprias aplicações, além das classes fornecidas pelo JDK.
O comportamento do HotSpot pode ser configurado por opções fornecidas ao comando java. As opções iniciadas por -X são específicas da implementação, enquanto parâmetros avançados iniciados por -XX permitem controlar aspectos como compilação JIT, tamanho do heap, coleta de lixo, diagnóstico e execução em ambientes com recursos limitados.
A máquina virtual oferece mecanismos que permitem a conexão de ferramentas de monitoramento e diagnóstico. Entre os utilitários fornecidos pelo JDK estão jcmd, jstack, jmap e jinfo, utilizados para consultar informações da máquina virtual, examinar threads e analisar o uso da memória.
O módulo jdk.hotspot.agent implementa o HotSpot Serviceability Agent e inclui o comando jhsdb, que pode ser conectado a um processo Java em execução ou utilizado para examinar arquivos de despejo de memória produzidos após uma falha da máquina virtual.
O código-fonte do HotSpot é distribuído no âmbito do OpenJDK sob a versão 2 da GNU General Public License.