1. Conceitos básicos
Cada programa Java GUNS gerará um processo Java. Cada processo Java pode conter um ou mais threads. Cada processo Java corresponde a uma instância JVM exclusiva, cada instância da JVM corresponde a uma pilha e cada thread possui sua própria pilha privada. Todas as instâncias de classes (ou seja, objetos) ou matrizes (referindo -se à própria matriz, não referências) criadas por um processo são colocadas na pilha e compartilhadas por todos os threads do processo. A memória alocada da heap em Java é inicializada automaticamente, ou seja, ao alocar a memória para um objeto, as variáveis no objeto serão inicializadas. Embora o espaço de armazenamento de todos os objetos em Java seja alocado na pilha, a referência a esse objeto é alocada na pilha, ou seja, quando um objeto é criado, a memória é alocada na pilha e na pilha. A memória alocada na pilha realmente armazena o próprio objeto criado, enquanto a memória alocada na pilha armazena apenas referências ao objeto Heap. Quando a variável local é lançada, o espaço é alocado no espaço da pilha e no espaço da pilha. Quando o ciclo de vida variável local termina, o espaço da pilha é imediatamente reciclado e a área do espaço da pilha está aguardando a reciclagem do GC.
Conceito específico: A memória de uma JVM pode ser dividida em três áreas: pilha, pilha e área de método (método, também chamado de área estática):
Área de pilha:
1. Todos os armazenados são objetos e cada objeto contém informações correspondentes a ele (o objetivo da classe é obter instruções de operação);
2.jvm possui apenas uma área de heap (heap) e é compartilhado por todos os threads. O heap não armazena tipos básicos e referências de objetos, mas apenas o próprio objeto e a própria matriz;
Área de pilha:
1. Cada encadeamento contém uma área de pilha, que salva apenas referências ao próprio tipo de dados básico e objetos personalizados;
2. Os dados (tipo primitivo e referência de objeto) em cada pilha são privados e não podem ser acessados por outras pilhas;
3. A pilha é dividida em 3 partes: área variável do tipo básico, contexto do ambiente de execução e área de instrução de operação (armazenando instruções de operação);
Área do método (área estática):
1. Compartilhado por todos os threads. A área do método contém todas as classes (a classe refere -se ao código original da classe. Para criar um objeto de classe, o código da classe deve ser carregado na área do método e inicializado) e variáveis estáticas.
2. A área do método contém elementos que são sempre únicos em todo o programa, como variáveis de classe e estática.
2. Exemplo de demonstração
AppMain.java
classe pública AppMain // Ao executar, a JVM coloca todo o código AppMain na área de método {public static void main (string [] args) // O próprio método principal é colocado na área do método. {Sample test1 = novo amostra ("teste 1"); // Test1 é uma referência; portanto, coloque na área da pilha, a amostra é um objeto personalizado, que deve ser colocado na pilha. Amostra test2 = nova amostra ("teste 2"); test1.printName (); test2.printName (); }} classe pública Amostra // Ao executar, a JVM coloca todas as informações do AppMain na área de métodos { /** nome de exemplo* /nome da string privada; // Após a nova instância da amostra, a referência de nome é colocada na área de pilha, o nome do objeto de string correspondente é colocado no heap/** construtor*/public sample (nome da string) {this .Name = name; } /** output* /public void printName () // Quando não houver objeto, o método de impressão é colocado na área do método junto com a classe de amostra. {System.out.println (nome); }}Ao executar o programa, inicie um processo de máquina virtual Java. Esse processo encontra primeiro o arquivo appMain.class do ClassPath, lê os dados binários no arquivo e, em seguida, armazena as informações da classe da classe AppMain na área de método da área de dados de tempo de execução. Este é o processo de carregamento da classe AppMain.
Em seguida, a máquina virtual Java localiza o bytecode do método Main () da classe AppMain na área do método e começa a executar suas instruções. A primeira declaração deste método Main () é:
A cópia do código é a seguinte:
Amostra test1 = nova amostra ("test1");
O processo de execução desta declaração:
1. A máquina virtual Java encontrou as informações de tipo da classe de amostra na área do método, mas não foi encontrada, porque a classe de amostra não foi carregada na área do método (pode -se ver aqui que as classes internas em Java existem separadamente e, no início, não será carregado com a classe contendo e não será carregado até que seja usado). A máquina virtual Java carrega imediatamente a classe de amostra e armazena as informações do tipo de classe de amostra na área do método.
2. A máquina virtual Java primeiro aloca memória para uma nova instância de amostra na área da pilha e armazena um endereço de memória na área de método em que as informações do tipo de classe de amostra são armazenadas na memória da instância da amostra.
3. No processo JVM, cada encadeamento terá uma pilha de chamadas de método, usada para rastrear uma série de processos de chamada de método durante a execução do thread. Cada elemento na pilha é chamado de quadro de pilha. Sempre que um thread chamar um método, um novo quadro será empurrado para a pilha de métodos. Os quadros aqui são usados para armazenar os parâmetros do método, variáveis locais e dados temporários durante a operação.
4. Test1 antes de "=" é uma variável (uma referência a um objeto de amostra) definido no método Main (), portanto será adicionado à pilha de chamadas do método Java do thread principal que executa o método principal (). E "=" apontará essa variável TEST1 para a instância da amostra na área da pilha.
5. A JVM continua a criar outra instância de amostra na área de heap e adiciona uma variável Test2 à pilha de chamadas do método do método principal, que aponta para a nova instância de amostra que acaba de ser criada na área de heap.
6. A JVM executa seu método printName (), por sua vez. When the JAVA virtual machine executes the test1.printName() method, the JAVA virtual machine locates the Sample instance in the heap area based on the reference held by the local variable test1, and then locates the Sample class type information in the method based on the reference held by the Sample instance, thereby obtaining the bytecode of the printName() method, and then executes the instructions contained in the printName() method to start execution.
Iii. Distinguir
A diferença entre heap e pilha na linguagem Java:
1. A pilha e a pilha são os dois lugares usados pelo Java para armazenar dados na RAM. Ao contrário do C ++, o Java gerencia automaticamente pilhas e pilhas, e os programadores não podem configurar pilhas ou montes diretamente.
2. A vantagem da pilha é que a velocidade de acesso é mais rápida que a pilha, perdendo apenas os registros localizados diretamente na CPU. Mas a desvantagem é que o tamanho e a vida útil dos dados na pilha devem ser determinísticos e não ter flexibilidade. Além disso, os dados da pilha podem ser compartilhados (consulte a introdução abaixo para obter detalhes). A vantagem do heap é que ele pode alocar dinamicamente o tamanho da memória e a vida útil não precisa ser contada ao compilador com antecedência. O coletor de lixo da Java coletará automaticamente os dados que não são mais usados. Mas a desvantagem é que a memória deve ser alocada dinamicamente em tempo de execução, a velocidade de acesso é mais lenta.
2 tipos de dados em java:
Um é o tipo primitivo, com 8 categorias, ou seja, int, curto, longo, byte, flutuador, duplo, booleano, char (observe que não há tipo básico de string). Este tipo de definição é definido por um formulário como int a = 3; longo b = 255l; e é chamado de variável automática. As variáveis automáticas têm valores literais, não instâncias de classes, ou seja, não são referências a classes, e não há classe aqui. Por exemplo, int a = 3; Aqui A é uma referência apontando para o tipo int, apontando para o valor literal de 3. Devido ao tamanho e vida útil desses dados literais, esses valores literais são definidos fixamente em um bloco de programa e o valor do campo desaparece após a saída do bloco de programa) e existe na pilha para a velocidade de perseguir.
A pilha tem um recurso muito importante: os dados que existem na pilha podem ser compartilhados. Suponha que definamos ao mesmo tempo: int a = 3; int b = 3; O compilador primeiro processos int a = 3; Primeiro, ele criará uma referência com uma variável A na pilha e descobrirá se existe um endereço com um valor literal de 3. Se não for encontrado, ele abrirá um endereço com o valor literal de 3 e depois apontará para o endereço 3. Então processará int b = 3; Depois de criar a variável de referência de B, como já existe um valor literal de 3 na pilha, B é diretamente apontado para o endereço de 3. Dessa maneira, A e B ambos apontam para 3 ao mesmo tempo.
Essa referência a valores literais é diferente da dos objetos de classe. Supondo que as referências de dois objetos de classe apontem para um objeto ao mesmo tempo, se uma variável de referência de objeto altera o estado interno do objeto, a outra variável de referência do objeto reflete imediatamente essa alteração. Em vez disso, modificar seu valor por meio de uma referência literal não fará com que outro valor seja alterado de acordo. Como no exemplo acima, depois de definirmos os valores de A e B, deixe A = 4; Em seguida, B não será igual a 4, ou igual a 3. Dentro do compilador, quando a = 4 for encontrado, ele se pesquisará se existe um valor literal de 4 na pilha. Caso contrário, reabre o endereço para armazenar o valor de 4; Se já existe, aponte diretamente a este endereço. Portanto, a mudança no valor a não afetará o valor b.
Outro tipo são dados da classe de embalagem, como número inteiro, string, dupla etc. que envolvem os tipos de dados básicos correspondentes. Todos esses dados de classe existem na pilha. O Java usa a instrução new () para exibir o compilador e só cria dinamicamente conforme necessário em tempo de execução, por isso é mais flexível, mas a desvantagem é que ele leva mais tempo.
4. Resumo
A estrutura de alocação de memória Java ainda é muito clara. Se você quiser entender completamente, pode verificar os livros relacionados à JVM. Em Java, a coisa mais problemática sobre a alocação de memória é o objeto String. Devido à sua natureza especial, muitos programadores são propensos a confusão. Vou explicar em detalhes no próximo artigo.