Ciclo de vida detalhado da classe (1)

Carregamento de classe:

  • O produto final do carregamento de classe é um Classobjeto localizado na pilha
  • ClassO objeto encapsula a estrutura de dados da classe na área de método e fornece uma interface para o programador JAVA para acessar a estrutura de dados na área de método
  • Tipos de carregadores de classes:
    1. O carregador que acompanha o
      carregador de classe raiz da máquina virtual java (1) (Bootstrap), escrito em C ++, não pode obter a classe no
      carregador de classe de extensão java code (2) (Extension), usando o código Java para atingir o
      sistema (3) Carregador de classes (ou aplicativo) (Sistema), usando código Java
    2. Carregador de classes definido pelo usuário
      (1) Subclasse de java.lang.ClassLoader
      (2) O usuário pode definir o método de carregamento da
      classe 3. O carregador de classes não precisa esperar que uma classe seja "usada pela primeira vez" antes de carregá-la:
      (1) A especificação jvm permite que o carregamento da classe pré-carregue uma classe quando se espera que seja usado.Se um .Classarquivo estiver ausente ou houver um erro durante o processo de pré-carregamento , o carregador de classes deve usar a classe somente quando o programa o usar ativamente Relatar erros (erros de LinkageError).
      (2) Se uma classe não tiver sido ativamente usada pelo programa, o carregador de classes não relatará um erro.
      (3) Após o carregamento da classe, ela entrará na fase de conexão. A conexão é mesclar os dados binários da classe que foram lidos na memória no ambiente de tempo de execução da máquina virtual.

Verificação de classe:

  • Inspeção da estrutura dos arquivos de classe: verifique se os arquivos de classe seguem o formato fixo dos arquivos java
  • Inspeção semântica: para garantir que a própria classe esteja em conformidade com os requisitos gramaticais da linguagem Java, como verificar se a classe do tipo final não possui subclasses e que o método do tipo final não é substituído (para impedir operações maliciosas de usuários mal-intencionados)
  • Verificação de bytecode: para garantir que o fluxo de bytecode possa ser executado com segurança pela máquina virtual java. O fluxo de bytecode representa métodos java (incluindo métodos estáticos e métodos de instância), é uma sequência de instruções de byte único denominadas opcodes e cada código de operação é seguido por um ou mais operandos. A etapa de verificação do bytecode verifica se cada código de operação é legal, ou seja, se possui operandos legais.
  • Verificação da compatibilidade binária: para garantir a coordenação entre as classes referenciadas mutuamente. Por exemplo Worker, o goWork()método da Carclasse será chamado no método da classe run(). Quando a máquina virtual Java verifica a Workerclasse, verifica se Caro run()método da classe existe na área do método.Se não existir (quando a versão da Workerclasse e da Carclasse forem incompatíveis, esse problema ocorrerá e será gerado um NoSuchMethodErrorerro)

Preparação da aula:

No estágio de preparação, a máquina virtual java aloca memória para as variáveis ​​estáticas da classe e define o valor inicial padrão. Por exemplo, as seguintes Simpleclasses, a fase de preparação, o inttipo de variáveis estáticas aalocados 4bytes de espaço de memória, e dado um valor padrão 0. Aloque um byte de espaço de memória para longuma variável estática do tipo e atribua um valor padrãob80

public class Simple {

    private static int a=1;
    public static long b;
    static {
        b=2;
    }
}

Fase de resolução da turma:

Na fase de análise, a máquina virtual Java substitui a referência simbólica nos dados binários da classe por uma referência direta, por exemplo Worker, o goWork()método da Carclasse será referenciado no método da classe run().

 public void goWork(){
        ca.run();//表示符号引用
    }

Em Workerinclui uma classe de dados binários do método de referências simbólicas, que consiste no nome completo da classe e composição descritor de método associado. Na fase de resolução, a máquina virtual substitui diretamente essa referência de símbolo por um ponteiro, que aponta para o local da memória do método da classe na área de método.Este ponteiro é uma referência direta.Carrun()run()Carrun()

Inicialização de classe:

1. Na fase de inicialização, a máquina virtual java executa a instrução de inicialização da classe e atribui valores iniciais às variáveis ​​estáticas da classe. No programa, existem duas maneiras de inicializar variáveis ​​estáticas:

  • Inicialize na declaração de variáveis ​​estáticas
  • Inicialize em um bloco de código estático.
    Por exemplo, no código a seguir, ambas as variáveis ​​estáticas ae bsão explicitamente inicializadas, mas cnão explicitamente inicializadas, manterá o valor padrão por padrão0
public class Simple {

    private static int a=1;
    public static long b;
    public static long c;
    static {
        b=2;
    }

}

2. As etapas da inicialização da classe:

  • Se essa classe ainda estiver disponível 没有加载和连接, carregue e conecte primeiro
  • Se a classe tiver uma classe pai direta e a classe pai não tiver sido inicializada, inicialize a classe pai direta primeiro
  • Se houver instruções de inicialização direta na classe, execute essas instruções de inicialização em sequência.

3. Tempo da inicialização da classe:
quando a máquina virtual java inicializa uma classe, todas as suas classes pai precisam ser inicializadas, mas essa regra não se aplica às interfaces.

  • Ao inicializar uma classe, ela não inicializa primeiro a interface que implementa
  • Quando uma interface é inicializada, sua interface pai não será inicializada primeiro.Portanto
    , uma interface pai não será inicializada devido à inicialização de sua subinterface ou classe de implementação, somente quando o programa usar pela primeira vez uma variável estática de uma interface específica. Causa a inicialização da interface.

Fase de uso:

Ainda existem três etapas no uso de classes: instanciação de objetos, coleta de lixo e finalização de objetos.

  • Instanciação de objeto: é o conteúdo do construtor na classe de execução.Se houver uma classe pai na classe, a JVM executará primeiro o construtor da classe pai exibindo ou implicitamente, criando espaço para as variáveis ​​de instância da classe pai na memória heap Atribua o valor inicial padrão e, em seguida, atribua o valor real à variável da instância, de acordo com o conteúdo do código do construtor.Em seguida, faça referência à variável para obter o primeiro endereço do objeto e chame a variável e o método da instância manipulando o objeto.
  • Coleta de lixo: quando o objeto não é mais referenciado, ele será marcado com uma marca de lixo especial pela máquina virtual e aguardará a coleta de GC na pilha
  • O fim do objeto: Depois que o objeto é reciclado pelo GC, o objeto não existe mais e a vida útil do objeto chega ao fim

Etapa de desinstalação:

Ou seja, o ciclo de vida da classe atingiu a última etapa. Não há mais uma referência à classe no programa e a classe será coletada como lixo pela JVM, e a vida terminará ...
Insira a descrição da imagem aqui

Publicado 41 artigos originais · Gostei 14 · Visitantes 10.000+

Acho que você gosta

Origin blog.csdn.net/Yunwei_Zheng/article/details/104018013
Recomendado
Clasificación