Arquitetura de Software "Arquitetura da Internet" - JVM (Parte 1)

Falando em JVM, muitos veteranos que trabalharam por muitos anos podem estar um pouco frustrados, porque eles têm movido tijolos por muitos anos e têm usado o java como ferramenta. Não tenho nenhum conhecimento de JVM. Há um ditado para entrevistar porta-aviões, parafusos de parafuso no trabalho e bicicletas., Basta saber como mover tijolos. Por que você precisa saber tanto? Se você tem grande perspicácia para os negócios, não precisa entender muito a fundo coisas, basta completar a função de negócios. Se você for eloqüente, há apenas um. O cérebro da programação, o velho ferro afunda seu coração, vamos entender juntos, a estrutura da chave que você costuma apertar o parafuso, isso é muito útil. Porque permite ir mais longe e ganhar mais!

Arquitetura de Software "Arquitetura da Internet" - JVM (Parte 1)

### JVM

Alguns conceitos de JVM

  • O que é JVM

JVM é a abreviatura de Java Virtual Machine (Java Virtual Machine). JVM é uma especificação para dispositivos de computação. É um computador fictício que é realizado através da simulação de várias funções de computador em um computador real. A máquina virtual Java inclui um conjunto de instruções de bytecode, um conjunto de registradores, uma pilha, um heap de coleta de lixo e um domínio de método de armazenamento. A JVM protege as informações relacionadas à plataforma de sistema operacional específica, de modo que os programas Java só precisam gerar código de objeto (bytecode) que é executado na máquina virtual Java e podem ser executados em várias plataformas sem modificação. Quando a JVM executa o bytecode, ela realmente interpreta o bytecode como a execução de instruções de máquina na plataforma específica.

  • JVM e máquina virtual comum
    1. JVM é uma Java Virtual Machine (máquina virtual Java), um ambiente para executar java bytecode, um ambiente independente do próprio programa, deve incluir instruções de pilha, registro e bytecode. Java, Android, Scala, Groovy e outras linguagens podem rodar na JVM e todas seguem o conjunto de instruções da JVM, ou seja, a especificação da classe.
    2. VMWare, VisualBox é um PC completo que pode fornecer um host virtual.O sistema operacional deve ser instalado nesta máquina virtual.É um conjunto de instruções que simula a CPU do host físico.

  • A relação entre JVM, JDK, JRE

    JVM é a unidade básica, JRE é o ambiente operacional de java, JDK é o conjunto de ferramentas de desenvolvimento
    JVM é menor que JRE e menor que JDK

1. JRE (JavaRuntimeEnvironment, Java Runtime Environment), que é a plataforma Java. Todos os programas Java devem ser executados no JRE. Os usuários comuns precisam apenas executar o programa Java desenvolvido e instalar o JRE.

2. JDK (Java Development Kit) é um kit de desenvolvimento usado por desenvolvedores de programas para compilar e depurar programas Java. As ferramentas do JDK também são programas Java e requerem JRE para serem executados. Para manter a independência e integridade do JDK, durante a instalação do JDK, o JRE também faz parte da instalação. Portanto, há um diretório denominado jre no diretório de instalação do JDK para armazenar arquivos JRE.

3. JVM (JavaVirtualMachine, Java Virtual Machine) faz parte do JRE. É um computador fictício, realizado pela simulação de várias funções do computador em um computador real. JVM tem sua própria arquitetura de hardware completa, como processadores, pilhas, registros, etc., bem como sistemas de instrução correspondentes. O recurso mais importante da linguagem Java é sua operação em plataforma cruzada. O uso de JVM é para suportar plataforma cruzada independente do sistema operacional.

  • Quais são os produtos JVM

    HotSpot, Jrockit, J9

  • Por que JVM
    1.C e C ++ são baseados na arquitetura do sistema operacional e na arquitetura da CPU. A versão de 64 bits não pode ser executada em 32 bits. O desempenho é muito alto, escreva a implementação subjacente.
    2. JAVA pode ser escrito uma vez e executado em qualquer lugar, com boa portabilidade.

Processo de execução JVM

1. Java é compilado em arquivos de classe, arquivos de bytecode, não em arquivos de bytecode binários puros e não pode ser executado diretamente no sistema operacional, enquanto arquivos binários puros podem ser executados diretamente.
2. Há um mecanismo de execução na JVM. Quando a JVM é compilada, ela é convertida em instruções correspondentes a diferentes sistemas operacionais. Envie-o para o sistema operacional. Todos os sistemas operacionais podem reconhecer suas próprias instruções.
3. O Windows é um programa dll, o linux é uma biblioteca de vínculo dinâmico de .o.
Arquitetura de Software "Arquitetura da Internet" - JVM (Parte 1)

Estrutura JVM

1. Carregador de classes
2. Mecanismo de execução
3. Área de dados de tempo de execução
4. Interface local

Arquitetura de Software "Arquitetura da Internet" - JVM (Parte 1)

  • ClassLoader

    A JVM carrega o arquivo .class. Na verdade, o carregamento da classe refere-se à leitura dos dados binários no arquivo .class da classe na memória, colocando-os na área de método da área de dados de tempo de execução e, em seguida, criando um objeto java.lang.Class na área de heap. para encapsular a estrutura de dados da classe na área do método. O produto final do carregamento da classe é o objeto Class localizado na área de heap. O objeto Class encapsula a estrutura de dados da classe na área do método e fornece uma interface para os programadores Java acessarem a estrutura de dados na área do método.
    Ao mesmo tempo, a especificação JVM permite que o carregador de classes pré-carregue uma classe quando ele antecipar que ela será usada. Se houver um erro ou falta no arquivo .class durante o processo de pré-carregamento, o carregador de classes irá usar ativamente a classe pela primeira vez no programa. Um relatório de erro (LinkageError) será gerado no momento. Se esta classe não tiver sido usada ativamente pelo programa, o carregador de classe não relatará um erro.

  • Modelo de Delegação Parental

Arquitetura de Software "Arquitetura da Internet" - JVM (Parte 1)

  • Processo de carregamento de classe

    1. Quando um carregador de classes recebe uma tarefa de carregamento de classe, ele não começa a carregar imediatamente, mas delega a tarefa de carregamento para que seu carregador de classes pai execute. Cada camada de classes usa o mesmo método até que seja delegada para Até a classe de inicialização de nível superior carregador. Se o carregador de classes pai não puder carregar a classe confiada a ele, ele retornará a tarefa de carregamento da classe para o próximo carregador de classes para realizar o carregamento.
    2. O processo de trabalho do modelo de delegação pai é: se um carregador de classe receber uma solicitação de carregamento de classe, ele não tentará primeiro carregar a classe sozinho, mas delega a solicitação ao carregador de classe pai para completar, cada nível de carregadores de classe são assim, todos os pedidos de carregamento devem, eventualmente, ser transmitidos para o carregador de classes de inicialização de nível superior, apenas quando o carregador de classes pai relata que não pode completar o pedido de carregamento (a classe que precisa ser carregada não é encontrada em seu intervalo de pesquisa) , o subloader tentará carregá-lo sozinho.
    3. A vantagem de usar o mecanismo de delegação pai é que ele pode efetivamente garantir a exclusividade global de uma classe.Quando várias classes com o mesmo nome qualificado aparecem no programa, o carregador de classes sempre carregará apenas uma das classes ao realizar o carregamento.
    4. Usar o modelo de delegação pai para organizar o relacionamento entre carregadores de classes tem uma vantagem óbvia de que as classes Java têm um relacionamento hierárquico de prioridade junto com seus carregadores de classes. Por exemplo, a classe java.lang.Object, que é armazenada em rt.jar, não importa qual carregador de classe deseja carregar esta classe, ela é finalmente confiada ao carregador de classe de inicialização no topo do modelo para carregamento, então A classe do objeto está no programa. Os vários ambientes do carregador são a mesma classe. Pelo contrário, se o modelo de delegação pai não for usado e cada carregador de classe o carregar sozinho, se o usuário escrever uma classe chamada java.lang.Object e colocá-la no ClassPath do programa, haverá mais com um diferente Classe de objeto, o comportamento mais básico no sistema de tipo Java não pode ser garantido, e o aplicativo se tornará caótico. Se você escrever uma classe Java com o mesmo nome da classe existente na biblioteca de classes rt.jar, verá que pode ser compilada normalmente, mas nunca será carregada e executada.
    5. O modelo de delegação pai é muito importante para garantir a operação estável de programas Java, mas sua implementação é muito simples. O código para implementar a delegação pai está concentrado no método loadClass () de java.lang.ClassLoader. A lógica é clara e fácil para entender: primeiro verifique se ele foi carregado, se não estiver, o método loadClass () do carregador de classes pai é chamado. Se o carregador pai estiver vazio, o carregador de classes de inicialização é usado como o carregador pai por padrão. Se o carregador de classe pai falhar ao carregar, depois de lançar ClassNotFoundException, chame seu método findClass para carregar.
  • Carregando
    Resumidamente, o carregador de classes é responsável pelo estágio do carregador de classes para ler os fluxos internos de bytes binários, como JVM, de acordo com um nome totalmente qualificado da classe e método de armazenamento da área de memória de tempo de execução na zona, em seguida, convertê-lo é uma instância do objeto java.lang.Class correspondente ao tipo de destino (a especificação da máquina virtual Java não exige explicitamente que ela seja armazenada na área de heap, mas o ponto de acesso escolhe armazenar a correspondência de classe na área de método), esta classe object is in No futuro, será usado como uma entrada de acesso para vários dados deste tipo na área do método.

  • O
    que fazer no estágio de link de link é mesclar as informações de dados de classe do fluxo de bytes binário carregado na JVM no estado de tempo de execução da JVM e passar por três estágios de verificação, preparação e análise.
    (1) Verifique
    se as informações de dados de verificação estão em conformidade com a especificação JVM e se é um arquivo bytecode válido.O conteúdo da verificação cobre a verificação de formato, análise semântica e verificação de operação das informações de dados.
    Verificação de formato: verifique se ele está em conformidade com a especificação do arquivo de classe.
    Verificação semântica: verifique se um tipo marcado como final contém subclasses; verifique se o vídeo do método final em uma classe é substituído por subclasses; certifique-se de que não há incompatibilidade entre a classe pai e a subclasse Algumas das declarações de método (como a mesma assinatura de método, mas o valor de retorno do método é diferente)
    Verificação de operação: Os dados na pilha de operandos devem ser operados corretamente e a verificação de várias referências de símbolo no conjunto de constantes ( geralmente realizado na fase de análise), Verifique se deseja localizar o tipo especificado por meio do nome totalmente qualificado descrito na referência rica e se o modificador de acesso das informações do membro da classe permite acesso, etc.)
    (2) Prepare-se
    para alocar espaço de memória para todas as variáveis ​​estáticas na classe e defini-lo Um valor inicial (porque o objeto ainda não foi gerado, a variável de instância não está dentro do escopo desta operação)
    é uma variável estática modificada final, será diretamente atribuído ao valor original ; o atributo ConstantValue na tabela de atributos de campo do campo de classe, no estágio de preparação, seu valor é ConstantValue value
    (3) parsing
    converte a referência de símbolo no pool de constantes em uma referência direta (obtendo o ponteiro ou deslocamento da classe ou , método na memória para chamar diretamente o método), que pode ser executado após a inicialização.
    Pode-se considerar que alguma vinculação estática será analisada, enquanto a vinculação dinâmica será analisada apenas durante a operação; a vinculação estática inclui alguns métodos finais (não devem ser substituídos), métodos estáticos (pertencem apenas à classe atual), construtor (não ser reescrito)

  • A inicialização
    executa todo o código identificado pela palavra-chave estática em uma classe de maneira uniforme. Se a execução for uma variável estática, o valor inicial definido na fase de preparação será substituído pelo valor especificado pelo usuário; se a execução for um código estático bloco, então, na fase de inicialização, a JVM executará todas as operações definidas no bloco de código estático.
    Todas as instruções de inicialização de variáveis ​​de classe e blocos de código estático serão colocados no coletor pelo compilador front-end durante a compilação e armazenados em um método especial, que é o método <clinit>, que é o método de inicialização de classe / interface. A função desse método é inicializar uma variável em uma, e usar o valor especificado pelo usuário para sobrescrever o valor inicial definido na fase de preparação. Qualquer bytecode, como invoke, não pode chamar o método <clinit>, porque esse método só pode ser chamado pela JVM durante o processo de carregamento da classe.
    Se a classe pai não foi inicializada, a classe pai é inicializada primeiro, mas o método <clinit> da classe pai não será exibido dentro do método <clinit>. A JVM é responsável por garantir que o método <clinit> de uma classe é executada antes de seu método A classe pai <clinit> ser executado.
    A JVM deve garantir que uma classe seja inicializada ao mesmo tempo. Se vários encadeamentos precisarem inicializá-la ao mesmo tempo, apenas um dos encadeamentos pode ter permissão para executar operações de inicialização nele e o restante dos encadeamentos deve esperar, somente após o encadeamento ativo executar as operações de inicialização na classe., notificará outros encadeamentos que estão esperando.

Área de dados de tempo de execução JVM

Quando a JVM executa o código Java, a memória é dividida em várias partes, a saber, área de dados para uso.Estas áreas têm seus próprios propósitos, e são criadas e destruídas com o início do processo JVM ou com o início e término dos threads do usuário.

Arquitetura de Software "Arquitetura da Internet" - JVM (Parte 1)

  • Registro do contador do programa

    Efeito do
    thread atual de execução, indicador de número de linha de bytecode, para selecionar a próxima instrução de bytecode a ser executada alterando este ponteiro

Características
1. Criado quando o thread é criado
2. Cada thread tem um
endereço 3. Apontando para a próxima instrução

  • Área do Método (não Heap)

    Compartilhamento de discussão

Armazenamento
1. Informações de classe
2. Constante
3. Variável estática
4. Bytecode do método

  • Pilha de VM / pilha de método nativo

    Tópico privado

Quando o método é executado, um Stack Frame é criado para armazenar informações como a tabela de variáveis ​​locais, pilha de operandos, vínculo dinâmico, saída do método, etc.

O processo desde a invocação até a conclusão do método corresponde ao processo de enviar um frame de pilha para a pilha da máquina virtual para abrir

O espaço de memória requerido pela tabela de variável local é alocado durante a compilação, e a quantidade de espaço de variável local alocada é completamente determinada, e seu tamanho não será alterado durante a execução do método

Espaço livre após desempilhar

  • Heap

    Compartilhamento de discussão

Objeto ou matriz de armazenamento

Divisão de heap

Arquitetura de Software "Arquitetura da Internet" - JVM (Parte 1)

  • JMM

Memória de trabalho da linha, memória principal

Modelo JMM

Arquitetura de Software "Arquitetura da Internet" - JVM (Parte 1)

PS: Eu resolvi o conceito de JVM e o relacionamento entre JVM e JDK, por que usar JVM, o entendimento de JVM, o processo de execução de JVM, o arquivo de classe é carregado na área de dados pelo mecanismo de execução de JVM e compilado nas instruções reconhecidas pelo sistema operacional Instruções diferentes do sistema operacional. JVM possui apenas uma classe para diferentes sistemas operacionais. Perceba plataforma cruzada. Os dados em execução da JVM são divididos em área de dados compartilhados por encadeamento (método, heap) e área de dados independente de encadeamento (pilha, contador de programa). JVM é basicamente coisas literais. Pode ser mais difícil de entender, mas é mais fácil de entender com a experiência de trabalho. É realmente um nível muito baixo.

Acho que você gosta

Origin blog.51cto.com/12040702/2605302
Recomendado
Clasificación