Este artigo leva você a entender o gerenciamento de memória da máquina virtual jvm

Área de dados de tempo de execução

  • Contador de programa (segmento privado)
    • Um pequeno espaço de memória pode ser considerado como um indicador de número de linha do bytecode executado pelo encadeamento atual. Se o encadeamento estiver executando um método java, o endereço da instrução bytecode da máquina virtual que está sendo executada será registrado; se o método nativo for executado, o valor do contador estará vazio. Nota: Essa área de memória é a única que não especifica OutOfMemoryError na especificação da máquina virtual java
  • pilha da máquina virtual java (thread privado)
    • A pilha da máquina virtual descreve o modelo de memória da execução do método java: cada método criará um quadro de pilha (quadro armazenado) usado para armazenar tabela de variáveis ​​locais, pilha de operandos, link dinâmico, saída do método e outras informações durante a execução.
    • A tabela de variáveis ​​locais armazena vários tipos de dados básicos, referências a objetos e tipos returnAddress (apontando para o endereço de uma instrução de bytecode) que são conhecidos em tempo de compilação.Nota: Entre eles, os dados longos e duplos de 64 bits ocuparão 2 variáveis ​​locais Espaço (slot), os dados restantes ocupam apenas um.
    • Duas exceções na área da pilha: StackOverflowError e OutOfMemoryError
  • Pilha de método local (segmento privado)
    • A pilha de métodos local é o serviço de método nativo usado pela máquina virtual
  • pilha de java
    • O heap é a maior parte de memória gerenciada pela máquina virtual, e o heap java é uma área de memória compartilhada por todos os encadeamentos, criada quando a máquina virtual é iniciada
    • Repartição do heap Java: nova geração e geração antiga. Tenha mais cuidado com o espaço do Éden, do espaço do sobrevivente, do espaço do sobrevivente, etc. Da perspectiva da alocação de memória, vários buffers de alocação privada de encadeamento (Buffer de Alocação Local de Encadeamento, TLAB) podem ser divididos no heap java compartilhado por encadeamentos
    • -Xmx e -Xms definem se a memória heap da máquina virtual pode ser expandida
  • Área do método (alias Non-Heap non-heap)
    • É usado para armazenar tabelas de dados como informações de classe, constantes, variáveis ​​estáticas e código compilado pelo compilador no tempo pela máquina virtual.
    • O pool constante de tempo de execução faz parte da área do método. Além da versão da classe, campos, métodos, interfaces e outras informações de descrição no arquivo da classe, também há um pool constante, usado para armazenar várias literais e referências de símbolos geradas pelo compilador.Esta parte será inserida após o carregamento da classe. Armazenado no pool constante de tempo de execução da área do método.
  • Memória direta
    • No jdk1.4, a nova classe nio foi adicionada e um método de E / S baseado em canais e buffers foi introduzido.Pode alocar diretamente a memória fora da pilha usando a biblioteca de funções nativa e, em seguida, usar um objeto directByteBuffer armazenado na pilha java como este Operação de referência de memória de bloco. Isso pode melhorar significativamente o desempenho em alguns cenários, pois evita a cópia de dados entre o heap java e o heap nativo.
    • A alocação de memória direta local não é limitada pelo tamanho da pilha java, mas se você ignorar a memória direta ao definir informações de parâmetro como -Xmx, a memória total poderá ser maior que o limite da memória física, resultando em uma exceção OutOfMemoryError durante a expansão dinâmica.

Vários OutOfMemoryError comuns

  • estouro de pilha de java
    • java.lang.OutOfMemoryError: espaço de heap do java
    • Quando ocorre um estouro de heap, o método geral é analisar o instantâneo de despejo de despejo de despejo usando uma ferramenta de análise de imagem de memória (como o eclipse memory analyzer). A primeira coisa a saber é se é um vazamento ou excesso de memória
  • Pilha de máquina virtual e estouro de pilha de método nativo
    • A capacidade da pilha é configurada apenas pelo parâmetro -Xss
    • Em relação à pilha da máquina virtual e à pilha do método local, duas exceções são descritas na especificação da máquina virtual java:
      • Se a profundidade da pilha solicitada pelo encadeamento for maior que a profundidade máxima permitida pela máquina virtual, StackOverflowerror será lançado
      • Se a máquina virtual não puder solicitar espaço suficiente ao expandir a pilha, um OutOfMemoryError será lançado
  • Área do método e estouro constante do pool de tempo de execução
    • Argumentos da VM: -XX: PermSize = 10M -XX: MaxPermSize = 10M
    • java.lang.OutOfMemoryError: espaço PermGen
  • Estouro de memória direta local
    • A capacidade do DirectMemory pode ser especificada por -XX: MaxDirectMemorySize, se não especificado, o padrão é o mesmo que o valor máximo do heap java
    • Um recurso óbvio do estouro de memória causado pelo directMemory é que nenhuma anormalidade óbvia será vista no arquivo Heap Dump. Se o arquivo de despejo for pequeno após a localização da OOM e o programa usar NIO direta ou indiretamente, você poderá considerar se Problema de aspecto

Estratégia de alocação de memória e reciclagem

Os objetos são alocados primeiro no Eden

Na maioria dos casos, os objetos são alocados na nova geração Eden. Quando não houver espaço suficiente para alocação na área Eden, a máquina virtual iniciará um GC Menor.

Objetos grandes vão diretamente para a geração antiga

O chamado objeto grande refere-se a objetos java que requerem uma grande quantidade de espaço de memória contínuo (os objetos grandes mais comuns são as seqüências longas e matrizes) A máquina virtual fornece um parâmetro -XX: PretenureSizeThreshold, para que objetos maiores que esse valor de configuração sejam alocados diretamente na geração antiga. O objetivo disso é evitar muitas cópias de memória entre a área do Éden e as duas áreas sobreviventes.

Objetos de vida longa entrarão na velhice

Objetos nascidos no Éden, que existem após o primeiro GC Menor e podem ser acomodados pelo sobrevivente, serão movidos para o sobrevivente com idade definida como 1. Cada vez, a idade +1 até o limite ser atingido (o padrão 15 pode ser definido por -XX: MaxTenuringThreshold)

Julgamento dinâmico por idade

Se a soma do tamanho de todos os objetos da mesma idade no espaço sobrevivente for maior que a metade do espaço sobrevivente, objetos maiores que ou iguais à idade entrarão diretamente na geração antiga sem aguardar que a idade atinja o limite.

Algoritmo de coleta de lixo

  • Algoritmo de varredura de marca
  • Algoritmo de replicação
  • Algoritmo de classificação de marcas
  • Algoritmo de coleção geracional

Ferramenta de monitoramento e solução de problemas de desempenho de máquinas virtuais

ferramenta de linha de comando jdk
  • jps: ferramenta de status do processo da máquina virtual
    • Você pode listar os processos da máquina virtual em execução e exibir o nome da classe principal de execução da máquina virtual (Classe Principal, a classe em que a função main () está localizada) e o ID exclusivo da máquina virtual local desses processos (Identificador da Máquina Virtual Local, LVMID)
    • -q: gera apenas LVMID, omitindo o nome da classe principal
    • -m: gera os parâmetros passados ​​para a função main () da classe principal quando o processo da máquina virtual é iniciado
    • -l: gera o nome completo da classe principal; se o processo executa um pacote jar, gera o caminho do jar
    • -v: produz parâmetros de jvm quando a máquina virtual é iniciada
  • jstat: ferramenta de monitoramento de estatísticas da máquina virtual
    • A JVM Statistics Monitoring Tool é uma ferramenta de linha de comando usada para monitorar várias informações de status operacional de máquinas virtuais.Pode exibir dados operacionais como reimpressão de classe, memória, coleta de lixo, compilação de jit etc. no processo de máquinas virtuais locais ou remotas. A ferramenta preferida para localizar problemas de desempenho da máquina virtual durante o tempo de execução
    • -gc: monitora a pilha de java, incluindo a área do Éden, duas áreas sobreviventes, a capacidade da geração antiga, geração permanente, etc., o espaço usado, a quantidade total de tempo de gc e outras informações
    • -class: monitora o carregamento da classe, a quantidade de descarga, o espaço total e o tempo gasto no carregamento da classe
    • -gcutil: o conteúdo de monitoramento é basicamente o mesmo que -gc, mas a saída se concentra principalmente na porcentagem de espaço usado no espaço total
  • jinfo: ferramenta de informações de configuração do java
    • A função das Informações de configuração para Java é exibir e ajustar vários parâmetros da máquina virtual em tempo real.
  • jmap: ferramenta de mapeamento de memória java
    • O comando Mapa de Memória para Java é usado para gerar instantâneos de despejo de heap (geralmente conhecidos como arquivos heapdump ou dump).
    • -dump: gera instantâneo de despejo de heap de java
      • -dump: [live,] format = b, file = live subparameter indica se apenas os objetos ao vivo são despejados
    • -heap: exibe informações detalhadas sobre o heap java, como qual coletor usar, configuração de parâmetros, status de geração etc.
    • -histo: exibe estatísticas de objetos no heap, incluindo classe, número de instâncias e capacidade total
    • -F: Quando o processo da máquina virtual não responde à opção -dump, você pode usar esta opção para forçar um instantâneo de dump.
  • jhat: ferramenta de análise de instantâneo de despejo de pilha da máquina virtual
    • O Sun JDK fornece o comando jhat (JVM Heap Analysis Tool) usado com o jmap para analisar a captura instantânea gerada de despejo de heap. Um pequeno servidor HTTP / HTML está embutido no jhat. Depois de gerar o resultado da análise do arquivo de despejo, você pode visualizá-lo no navegador.
    • Nota: geralmente não use este comando para analisar arquivos de despejo no servidor de produção
      • As ferramentas de análise são um processo demorado e demorado
      • A função de análise do jhat é relativamente simples
  • jstack: ferramenta de rastreamento de pilha java
    • O comando Stack Trace for Java é usado para gerar uma captura instantânea de encadeamento da máquina virtual no momento atual (geralmente chamado de threaddump ou arquivo Javacore)
    • -l: além da pilha, exiba informações adicionais sobre o bloqueio
    • -m: se você chamar um método local, poderá exibir a pilha C / C ++
    • -F: Quando a solicitação de saída normal não for respondida, force a pilha de encadeamentos de saída
Publicado 8 artigos originais · Gosto1 · Visitas 263

Acho que você gosta

Origin blog.csdn.net/qq_40635011/article/details/105413114
Recomendado
Clasificación