Carregamento de classe:
- O produto final do carregamento de classe é um
Class
objeto localizado na pilha Class
O 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:
- 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 - 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.Class
arquivo 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.
- O carregador que acompanha o
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
, ogoWork()
método daCar
classe será chamado no método da classerun()
. Quando a máquina virtual Java verifica aWorker
classe, verifica seCar
orun()
método da classe existe na área do método.Se não existir (quando a versão daWorker
classe e daCar
classe forem incompatíveis, esse problema ocorrerá e será gerado umNoSuchMethodError
erro)
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 Simple
classes, a fase de preparação, o int
tipo de variáveis estáticas a
alocados 4
bytes de espaço de memória, e dado um valor padrão 0
. Aloque um byte de espaço de memória para long
uma variável estática do tipo e atribua um valor padrãob
8
0
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 Car
classe será referenciado no método da classe run()
.
public void goWork(){
ca.run();//表示符号引用
}
Em Worker
inclui 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.Car
run()
run()
Car
run()
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áticasa
eb
são explicitamente inicializadas, masc
nã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á ...