O que a JVM precisa carregar é um fluxo binário, que pode estar na forma de um arquivo .class ou outros formulários. Se você o projetar de acordo com os padrões de carregamento, não haverá um grande problema.
O seguinte analisa principalmente as duas questões de mecanismo e padrões:
Primeiro, vamos pegar o mecanismo de carregamento dos arquivos de classe Java, que é semelhante ao mecanismo de carregamento das variáveis. Primeiro, ele carrega o arquivo de classe na memória, verifica, analisa e inicializa os dados e, finalmente, forma um tipo Java que a máquina virtual pode usar diretamente. Como o Java adota o mecanismo JIT, ele demorará a carregar, mas suas vantagens são óbvias, possui alta flexibilidade e suporta conexões dinâmicas de carga e dinâmica.
Em seguida, vamos falar sobre o processo de carregamento da classe:
O processo básico de um carregamento de classe está na seguinte ordem, mas alguns não estão estritamente nessa ordem e alguns estão na ordem desordenada. Por exemplo, o carregamento dinâmico requer inicialização e depois analisando.
1. Carregando
Cabe à máquina virtual decidir, mas também há casos em que a fase acima é executada porque a fase a seguir deve ser executada.
Neste momento, a máquina virtual faz três coisas:
Primeiro, leia o fluxo binário do arquivo através de um nome totalmente qualificado;
Segundo, coloque os métodos e variáveis estáticos no arquivo na área de métodos;
Terceiro, gere um objeto e coloque -o na pilha como um portal de acesso.
Observe que o primeiro é ler o fluxo binário e não diz de qual arquivo é lido ou de onde é lido. Portanto, cria forte escalabilidade em Java, que pode ser de jar, zip ou da camada de rede, camada de banco de dados, etc.
Principalmente a declaração da área de objeto e método.
2. Verificação
Certifique -se de que o fluxo binário atenda aos requisitos da máquina virtual e não atenda ao verificador.
Primeiro, a verificação do formato de arquivo, se existem números mágicos e se eles atendem aos requisitos dos arquivos Java;
Segundo, a verificação de metadados, seja cumpre com as especificações do código Java, como se a classe abstrata é diretamente instanciada, se a classe comum possui objeto de classe pai indireto ou direto, etc.; Terceiro, a verificação do bytecode, analisa o fluxo de dados e o fluxo de controle e garante que não haja comportamento que prejudique a máquina virtual, como chamar instruções inexistentes, se deve atribuir a classe pai à subclasse, se deve atribuir o objeto a um objeto desse tipo, etc.;
Quarto, verificação de referência simbólica, principalmente se a descrição de classes, variáveis e método pode ser encontrada, como se o arquivo pode ser encontrado com um nome totalmente qualificado, seja acessível etc.
Determine principalmente a estrutura interna
3. Prepare
Atribuir um valor inicial a uma variável de classe geralmente é um valor 0, como uma variável estática, sem atribuir um valor a uma variável de instância.
4. Análise
O processo de conversão de referências simbólicas em um pool constante em referências diretas. A referência simbólica mencionada aqui refere -se ao tipo de variável e referência direta refere -se ao identificador que pode ser localizado diretamente ao objeto. Classe, método, campo, interface análise, obtenha o objeto relevante de acordo com o nome totalmente qualificado e obtenha seu tipo. Se não houver acesso à classe, o BelAccessError ilegal será jogado, nenhum Nosuchfielderror de campo será jogado, nenhum método que noschmethoderror será jogado, se for uma classe ou não, a interface será lançada.
5. Inicialização
Carregar classes e recursos necessários de acordo com os requisitos do programa. Existem apenas quatro situações e você precisa inicializar ativamente antes de executar a próxima operação, para primeiro executar as quatro etapas acima.
Primeiro, aulas com palavras -chave novas ou estáticas, novos objetos gera e cargas estáticas estáticas, esses dois obviamente serão inicializados;
Segundo, se você usar uma aula, não há nada que você possa fazer sobre isso;
Terceiro, os métodos na classe de reflexão devem ser inicializados, certo?
Quarto, a principal classe de execução, a classe que usa o método principal. Outras situações de inicialização passiva não precisam ser consideradas.
Pequenos exemplos:
public class Superclass {static {System.out.println ("superclass !!");} public static int vale = 1;} classe pública Subclass estende a superclass {static {System.out.printlnn ("Subclass !!");}} classe Public class) {System.out.println (subclass.value); superclass superclass = new subclass ();}} superclass !! 1Subclass !!O resultado da execução mostra um problema: quando a subclasse chama a variável da classe pai, a subclasse não é inicializada porque o relacionamento de código no momento não tem nada a ver com a subclasse; Quando a subclasse é inicializada, a classe pai não é inicializada novamente porque a classe pai foi inicializada no corpo do método atual. A única diferença entre uma interface e uma classe pai é que a inicialização da interface não requer a interface pai e será inicializada apenas quando a interface pai for usada e o mesmo construtor de classe será gerado.
No momento, o construtor de classe será carregado e todas as variáveis da classe serão inicializadas. Obviamente, a classe pai será inicializada antes da classe infantil.
6. Uso
Após o carregamento, como chamá -lo, desenhar, cálculo, etc.
7. Desinstale
A classe não é mais chamada
Se as duas classes são iguais depende principalmente do primeiro carregamento usando o mesmo carregador, e o segundo endereço de nome totalmente qualificado é o mesmo
Por que fazer as perguntas acima? Em seguida, falaremos sobre um mecanismo de carregamento de uma máquina virtual.
Do ponto de vista das máquinas virtuais Java, existem dois carregadores de classe, um é chamado de carregador do sistema (bootstrap Classloader) e o outro é chamado de carregador personalizado (estende o carregador de classe). Isso é dividido em dois, um é chamado de carregador de aplicativos e o outro é chamado de carregador de classe de extensão, que geralmente é inadimplente para o primeiro; E nosso carregamento de aplicativos é feito principalmente pelos três carregadores acima. A relação entre os três é aplicação> extensão> bootsrap. O mecanismo de delegação pai refere -se à combinação de dois pares. O carregador filho chama primeiro o método do carregador pai e o objeto de destino não é encontrado antes de usar o carregador filho.
O pseudo-código é o seguinte:
carregamento (nome da string, resolução booleana) {classe c = findLoadLeDclass () if (c == null) {if (parent! = null) c = parent.loadclass (nome, false); c = findBootstrapClassornull (name);} catch (classNotFoundException ({} se (c= n)Java defende que escrevemos a lógica de nossa classe de chamada no FindClass, que nos ajudará a usar o mecanismo de delegação dos pais normalmente.
Destrua 1. Reescrever a classe de carga
Destrua 2. Use o carregador de contexto de encadeamento para deixar o carregador pai chamar o método do carregador filho
Destruição 3. O método comumente usado para carga a quente é personalizar o carregador de classe e substituir o módulo de bug original - Osgi
No entanto, se as regras entre os carregadores personalizados estiverem confusos e houver um problema de se referir um ao outro ao mesmo tempo, a classe não será encontrada e o impasse e os vazamentos de memória ocorrerão.
Em relação ao reparo quente, também conhecido como plug-ins, os mais populares são o hotfix, o Nuwa, Droidfix e Fix, etc. Essas estruturas podem ser encontradas no Github ou em outros lugares. Os princípios são como acima, os métodos são diversos, há cobertura, redirecionamento etc., por meio de configuração, ações de definição, etc.; Como plug-ins, as seguintes condições precisam ser atendidas:
1. Pode ser instalado de forma independente, mas não pode ser executado de forma independente
2. Seja compatibilidade com versões anteriores, pode ser expandida
3. Ele só pode ser executado no programa host e pode ser desativado ou substituído
A explicação acima do exemplo do mecanismo de carregamento de máquina virtual Java é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.