Introdução: A análise de fuga é um ponto técnico que não é usado em muitas tecnologias de JVM. Este artigo analisará seus cenários de uso por meio de um exemplo.
A análise de escape é um algoritmo multifuncional de análise global de fluxo de dados que pode efetivamente reduzir a pressão de alocação de carga síncrona e de alocação de memória nos programas Java. Através da análise de escape, o compilador de hotspot Java pode analisar o escopo do uso da referência de um novo objeto e determinar se alocar o objeto à pilha.
No princípio de otimização do compilador de linguagem de computador, a análise de escape refere -se ao método de analisar a faixa dinâmica de ponteiros, que está associada à análise de ponteiros e análise de aparência do princípio de otimização do compilador. Quando uma variável (ou objeto) é alocada em um método, seu ponteiro pode ser retornado ou referenciado globalmente, que será referenciado por outros processos ou threads. Esse fenômeno é chamado de fuga do ponteiro (ou referência).
O Java suporta e permite opções de análise de escape no Java SE 6U23 e versões posteriores. O Hotspot JIT Compiler da Java pode executar a análise de escape no código quando o método é sobrecarregado ou carregado dinamicamente. Ao mesmo tempo, as características dos objetos Java que alocam na pilha e nos threads embutidos tornam a análise de escape uma função importante do Java.
O parágrafo acima é uma passagem que citei de outra pessoa. O artigo usa muitos termos profissionais. Deixe -me resumir seu significado:
A análise de escape é usada para determinar se certas instâncias ou variáveis são alocadas na pilha. Se a análise de escape estiver ativada, essas variáveis poderão ser alocadas diretamente na pilha e não na pilha. Os ponteiros dessas variáveis podem ser referenciados globalmente ou referenciados por outros threads.
Ligue as configurações
O padrão está ativado no JDK 6U23 ou acima. Aqui vamos redefinir as configurações:
Forçado a abrir
-Server -xx:+dodaCapeanAlysis -xx:+printgcdetail -xmx10m -xms10m
Análise de Escape Close
-server -xx: -doescapeanalysis -xx:+printgcdetail -xmx10m -xms10m
Verificação da instância
Código:
classe pública OnStacktest {public static void alloC () {byte [] b = novo byte [2]; b [0] = 1; } public static void main (string [] args) {long b = system.currenttimemillis (); for (int i = 0; i <100000000; i ++) {aloc (); } long e = System.CurrentTimemillis (); System.out.println (e - b); }}Ligue os resultados da operação de fuga:
Escreva uma descrição da imagem aqui
Resultados em execução da análise de fuga não habilitada:
Escreva uma descrição da imagem aqui
Para analisar, aqui está para alocar 2 bytes de ciclos de dados de 10 milhões de vezes, o tempo de execução para o Activate Escape é de 8 milissegundos, enquanto o não ativado é 956, que é quase 1/120 de não ativado.
O efeito da diferença ainda é muito óbvio ...
O espaço na pilha é geralmente muito pequeno e só pode armazenar várias alterações e pequenas estruturas de dados, e as estruturas de armazenamento de grande capacidade não podem ser alcançadas. O exemplo aqui é uma extrema dezenas de milhões de vezes, destacando a análise de fuga, permitindo que ela seja alocada diretamente da pilha, o que reduz bastante o número de GCs e melhora a eficiência geral da execução do programa.
Portanto, o efeito da análise de fuga só pode entrar em vigor em cenários específicos, que atendem à estrutura de alocação variável com capacidade relativamente pequena com alta frequência e alto número.