Profundo entendimento da compilação e otimização de jvm-backend

Este artigo é uma nota de leitura

1. Compilador just-in-time

Código do ponto de acesso Um
método ou bloco de código é executado com frequência frequente (recursiva). Esses códigos são chamados de códigos de ponto de
acesso.Um compilador de back-end que compila o código do ponto de acesso no código local é chamado de compilador just-in-time.

Várias questões levantadas no início do artigo:

1. Por que a máquina virtual HotSpot usa uma arquitetura na qual coexistem um intérprete e um compilador em tempo real?

  • Quando o programa precisa ser iniciado e executado rapidamente, o intérprete pode desempenhar um papel primeiro, economizar tempo de compilação e executar imediatamente.
  • Após o início do programa, com o passar do tempo, o compilador gradualmente desempenha um papel, compilando cada vez mais código no código local, o que pode reduzir a perda intermediária do intérprete e obter maior eficiência de execução. Quando o limite de recursos de memória é grande no ambiente em execução do programa, você pode usar a execução interpretada para economizar memória
  • Intérpretes e compiladores geralmente trabalham juntos para se complementarem
    Insira a descrição da imagem aqui

2. Por que a máquina virtual HotSpot implementa dois (ou três) diferentes compiladores em tempo real?
Principalmente para compilação hierárquica.Quando a compilação
hierárquica, o intérprete, o compilador do cliente e o compilador do servidor funcionarão ao mesmo tempo, o código quente pode ser compilado várias vezes, use o compilador do cliente para obter uma compilação mais alta Acelere, use o compilador do lado do servidor para obter melhor qualidade de compilação e não precise executar a tarefa adicional de coletar informações de monitoramento de desempenho ao interpretar e executar e quando o compilador do lado do servidor usar um algoritmo de otimização de alta complexidade, o compilador do lado do cliente Você pode usar a otimização simples para obter mais tempo de compilação.

3. Quando o programa é executado usando o intérprete? Quando usar o compilador para executar?
Insira a descrição da imagem aqui

4. Qual código de programa será compilado no código local? Como compilar código local?
· Um método chamado várias vezes. · Corpo do loop que é executado várias vezes.

O objeto de destino da compilação é o corpo inteiro do método, não um corpo de loop separado.

No primeiro caso, como se baseia na compilação acionada por método, o compilador naturalmente tomará todo o método como objeto de compilação.Esta compilação também é o método padrão de compilação just-in-time na máquina virtual.

No último caso, embora a ação de compilação seja acionada pelo corpo do loop e o ponto de acesso seja apenas parte do método, o compilador ainda deve usar o método inteiro como objeto de compilação, apenas a entrada de execução (a partir das poucas instruções de bytecode do método Execução) será um pouco diferente e o número do código de byte (Índice de Código de Byte, BCI) do ponto de entrada da execução será passado durante a compilação. Esse método de compilação é chamado de "On Stack Replacement" (OSR) porque a compilação ocorre durante a execução do método, ou seja, o quadro de pilha do método ainda está na pilha e o método é substituído.

5. Como observar o processo de compilação e o resultado da compilação just-in-time do lado de fora?

Alguns parâmetros em execução exigem que as máquinas virtuais HotSpot no nível de otimização FastDebug ou SlowDebug sejam suportadas.As máquinas virtuais no nível do produto não podem usar esses parâmetros.
Ou seja, a pessoa comum não pode observar a
compilação manualmente, ou a versão não oficial da compilação

2. Compilador avançado

Uma ramificação é semelhante aos compiladores C e C ++ tradicionais, que compilam o código do programa no trabalho de tradução estática do código de máquina antes da execução do programa;

A outra ramificação é pré-compilar e salvar o trabalho de compilação que o compilador just-in-time original precisa fazer no tempo de execução. Na próxima vez em que executar esses códigos (como o código da biblioteca comum é usado por outros processos Java na mesma máquina), ele é carregado diretamente. Entre e use.

Pode-se ver que o exemplo do surto do Android é o uso perfeito da compilação antecipada

3. tecnologia de otimização

A tecnologia de otimização do compilador
apresenta principalmente quatro tipos: 1. Otimização técnica final: introdução de métodos 2. A tecnologia de otimização mais avançada: análise de escape 3. Tecnologia de otimização clássica independente de idioma: eliminação de subexpressão comum 4. Otimização clássica relacionada a idioma Tecnologia: eliminação de verificação de limite de matriz
Inlining de método: Inlining de
método é "copiar" o código do método de destino para o método que iniciou a chamada intacta, evitando a chamada real do método.
Para o método java, a dificuldade é que muitos métodos são virtuais, e a seleção polimórfica da chamada não é conhecida antes da execução.Para resolver esse problema, a máquina virtual java introduz um método chamado análise de herança de tipo (CHA). Métodos diferentes são usados ​​em situações diferentes:
① Se for um método não virtual, basta incorporar.
FSe for um método virtual e esse método tiver apenas uma versão de destino a ser selecionada no estado atual do programa, poderá ser "guardada em linha" assumindo. Como o novo tipo pode ser carregado no futuro, o que mudará a conclusão do CHA, esse inlining é uma otimização preditiva radical e a "porta de escape" deve ser reservada.
③Se for um método virtual e houver várias versões para escolher, o cache embutido será usado para reduzir o custo de invocação de método, que pode ser entendido como o registro de cada invocação de método de versões diferentes e só é necessário julgar o método após a próxima chamada. Qual versão é adotada pode ser incorporada imediatamente.
Análise de escape:
Este não é um meio de otimizar diretamente o código, mas uma técnica de análise que fornece uma base para outras medidas de otimização.
Quando um objeto é definido em um método, ele pode ser referenciado por um método externo.Este método é chamado de escape de método e é acessado por threads externos.Este é chamado de escape de thread. De nenhum escape ao método, o escape ao thread thread é chamado de níveis diferentes de escape do objeto, de baixo para alto.
Se um objeto não escapar ou a probabilidade de fuga for extremamente baixa, você poderá fazer a seguinte otimização:
① Alocação na pilha: deixe que esse objeto não aloque memória no heap java, aloque memória diretamente na pilha, o espaço de memória ocupado pelo objeto poderá O quadro da pilha é exibido e destruído.
Replacement Substituição escalar: um dado não pode ser decomposto em dados menores para representar; então, este é um escalar; caso contrário, é um agregado. O objeto é uma quantidade agregada típica.Se o objeto não escapar, pode ser desmontado e suas variáveis ​​de membro podem ser restauradas para o tipo original para acesso de acordo com a situação de acesso ao programa.
Elimin Eliminação da sincronização: não será acessada por outros threads sem escapar, portanto as medidas de sincronização dessa variável podem ser canceladas.
Eliminação de subexpressão comum:
para variáveis ​​que foram calculadas, o resultado pode ser chamado em chamadas subseqüentes e a expressão da variável é excluída.
Se essa otimização é limitada aos blocos básicos do programa, ela pode ser chamada de eliminação local comum da subexpressão; o escopo da otimização abrange vários blocos básicos, que podem ser chamados de eliminação global global da subexpressão.
A verificação de limite de dados elimina
Java é uma linguagem de segurança dinâmica. Cada vez que você acessa os dados, é necessário verificar os limites superior e inferior, mas cada verificação precisa desperdiçar muito tempo de execução. Portanto, o tratamento implícito de exceção é usado e a verificação é realizada apenas quando ocorre um erro.

Publicado 37 artigos originais · ganhou elogios 6 · vista 4638

Acho que você gosta

Origin blog.csdn.net/littlewhitevg/article/details/105567500
Recomendado
Clasificación