"Compreensão profunda da máquina virtual", lendo a alocação e o layout da memória do objeto de anotações

Alocação e layout de memória de objeto

  • Criar (novo, clone, reflexão, desserialização)
    • new-> O pool constante localiza a referência do símbolo e verifica se a classe representada pela referência do símbolo é carregada, resolvida e inicializada. Caso contrário, o processo de carregamento de classe é realizado
    • A memória necessária do objeto pode ser completamente determinada após a conclusão do carregamento da classe.
    • O método de alocação de memória do objeto é determinado se o coletor de lixo tem uma função de compactação e classificação
      • Colisão de ponteiro: a memória heap é absolutamente regular e a memória usada e a memória livre são demarcadas pelo ponteiro. A alocação de memória precisa apenas mover o ponteiro de acordo. Serial, parNew e outros coletores com processo Compact.
      • Lista livre: grave endereços de memória livre. Atualize a lista ao mesmo tempo ao alocar memória. cms é um coletor baseado no algoritmo Mark-Swap.
    • Segurança de thread da alocação de memória do objeto
      • Sincronização ao alocar memória - A máquina virtual adota o método de repetição de falha de CAS mais
      • Buffer de Alocação Local de Segmentos
        • O heap é pré-alocado para um determinado espaço de memória do encadeamento e essa parte é usada primeiro ao alocar memória.
        • Somente quando o TLAB é usado, ele é sincronizado quando é redistribuído.
        • A utilização ou não é determinada pelo parâmetro -XX: +/- UserTLAB
  • Layout de memória
    • Cabeçalho do objeto
      • MarkWord
        • Armazene os dados de tempo de execução do próprio objeto, como código de hash, idade da geração do GC, status do bloqueio, bloqueio retido pelo encadeamento, ID do encadeamento polarizado, carimbo de data / hora polarizado
        • 32 bits e 64 bits em máquinas virtuais de 32 e 64 bits (sem ponteiros compactados)
        • Estrutura de dados não fixa, espaço de armazenamento multiplexador de acordo com o status do objeto

      • Ponteiro de Klass
        • O objeto aponta para um ponteiro para seus metadados de classe, que é usado para determinar qual instância de classe o objeto está
        • Não completamente através do próprio objeto, o identificador do conjunto de identificadores é salvo nos dados da instância e nos ponteiros de dados do tipo
        • Se o objeto for uma matriz Java, você precisará de um espaço para registrar o comprimento da matriz, pois não poderá ser determinado pelas informações de metadados dos objetos Java comuns
    • Dados de exemplo
      • As informações efetivas que o objeto realmente armazena, ou seja, o conteúdo de vários tipos de campos definidos
      • A ordem de armazenamento é afetada pela ordem em que as estratégias e os campos de alocação de máquina virtual são definidos no código-fonte
        • Alocação padrão do HotSpot (campos da mesma largura são alocados juntos): longs / double, ints, shorts, chars, bytes / booleans, oops (ponteiros de objetos comuns)
        • O campo definido pela classe pai é anterior à subclasse
        • Se o valor do parâmetro CompactFields for verdadeiro, as variáveis ​​mais estreitas da subclasse serão inseridas nas lacunas das variáveis ​​da classe pai
    • Alinhar preenchimento
      • Função de espaço reservado
      • O ponto de acesso estipula que o endereço inicial de um objeto deve ser um múltiplo inteiro de 8 bytes, ou seja, o objeto deve ser um múltiplo inteiro de 8 bytes
      • O cabeçalho do objeto é um múltiplo de 8 bytes (1x ou 2x), portanto, essa parte é para preencher as lacunas nos dados da instância quando necessário
  • Segmentação por acesso
    • A JVM manipula os objetos na pilha através dos dados de referência na pilha, e sua essência é apenas uma referência ao objeto
    • O caminho é determinado pela máquina virtual, as duas principais correntes
      • Lidar com acesso
        • A memória é dividida no heap como o pool de identificadores e a referência armazena o endereço do identificador do objeto
        • O identificador inclui informações de endereço dos dados da instância do objeto e dados do tipo
        • A vantagem é a estabilidade, quando o objeto é movido, apenas o endereço de dados da instância do identificador é alterado
      • Acesso direto ao ponteiro (Hotspot)
        • Endereço do objeto armazenado por referência
        • O objeto de heap correspondente deve armazenar informações sobre os dados do tipo (ponteiro Klass)
        • A vantagem é alta eficiência, economizando o tempo de posicionamento do ponteiro
Publicado 24 artigos originais · elogiado 0 · visitas 104

Acho que você gosta

Origin blog.csdn.net/jiangxiayouyu/article/details/105614174
Recomendado
Clasificación