Detalhes da Java JVM:
Conhecimento relacionado sobre JVM
1. Memória Heap e Stack
1. A memória da pilha na JVM armazena principalmente referências a tipos básicos de variáveis e objetos.
2. A memória da heap na JVM armazena principalmente objetos e matrizes criados com strings novas e de comprimento variável (StringBuilder e StringBuffer) são armazenadas na memória da heap.
A vantagem de usar o heap é que ele é dinamicamente alocado espaço de armazenamento, o que é mais flexível, mas a desvantagem é que é mais lento para alocar dinamicamente a memória; Embora o uso da pilha seja mais rápido, e o compartilhamento de dados pode ser alcançado, mas a desvantagem é que o tamanho e a vida útil dos dados na pilha devem ser determinados e não têm flexibilidade
3. A alocação de armazenamento estático é usada para armazenar variáveis estáticas e blocos de código estático.
2. Compreensão da JVM
A JVM é uma máquina virtual Java. Ele bloqueia informações relacionadas à plataforma específica do sistema operacional, para que o programa Java gere apenas o código do objeto (código de byte) em execução na máquina virtual Java, para que a operação de plataforma cruzada possa ser alcançada;
Seu princípio é: o arquivo de origem Java é compilado em programas de bytecode através do compilador Java e cada instrução é traduzida em código de máquina de diferentes plataformas através da JVM e executa por uma plataforma específica;
A área de memória da JVM é dividida principalmente em: área de método, pilha JVM, pilha, pilha de métodos locais, contador de programas
Contador do programa: usado para gravar a instrução atualmente executada, que é a única área sem OOM;
Pilha JVM: Thread é privado. Cada encadeamento criará uma pilha JVM ao mesmo tempo. Ele armazena variáveis básicas locais no encadeamento atual, resultados de retorno parcial, quadro de pilha e endereço de referência de objeto;
Heap: compartilhamento de threads, usado para armazenar alguns objetos e matrizes; Como é compartilhado, são necessárias bloqueios, o que leva a uma sobrecarga alta;
Área do método: Esta área de método corresponde a uma geração persistente, que armazena as informações da classe (nome, modificador, etc.), variáveis estáticas na classe, constantes definidas na classe com final, etc.;
Pilha de métodos locais: usado para apoiar a execução de métodos nativos e para armazenar o status de chamada de cada método nativo;
A coleta de lixo Java se concentra principalmente nas áreas de heap e métodos: o heap é dividido na nova geração e na geração antiga, e geralmente os objetos que acabaram de serem novos serão colocados na nova geração; e a nova geração é dividida na área do Éden e em duas áreas de sobrevivência;
O mecanismo da coleta de lixo é: primeiro determine quais objetos são lixo, ou seja, eles não são mais usados e, em seguida, use os algoritmos correspondentes (algoritmo de limpeza de marcas, algoritmo de cópia, algoritmo de mark-tiding, algoritmo de coleta de geração) para coletar o lixo;
1. Algoritmo de limpeza de marcas:
É dividido em dois estágios, o estágio de marcação e o estágio de limpeza. Primeiro, marque o objeto que precisa ser reciclado e depois reciclar o espaço ocupado pelo objeto de marcação;
Sua implementação é relativamente simples, mas sua desvantagem é que é fácil gerar fragmentos de memória, resultando na incapacidade de encontrar memória suficiente ao alocar espaço para objetos grandes no futuro e desencadear uma nova ação de coleta de lixo com antecedência;
2. Algoritmo de cópia:
Para resolver as deficiências do algoritmo de limpeza de marcas, o algoritmo de cópia divide a memória em duas áreas de tamanho igual de acordo com a capacidade, e apenas uma delas é usada por vez. Depois que uma peça é usada, o objeto ainda sobrevivente é copiado para outra área e, em seguida, a área usada é limpa, de modo que a fragmentação não é fácil de ocorrer;
O problema da fragmentação da memória é resolvido, mas a desvantagem é que a memória usada é reduzida a metade do original, e a eficiência de cópia está relacionada ao número de objetos sobreviventes. Quando o número é grande, a eficiência é bastante reduzida;
3. Algoritmo de organização de marcação
Para resolver os defeitos do algoritmo de cópia, o algoritmo mark-tidy nasceu, e o estágio de marcação também era como o algoritmo de limpeza de marcas. Primeiro, os objetos que precisam ser reciclados estão marcados, mas não os recicla diretamente, mas move todos os objetos sobreviventes para o outro lado e depois limpa a memória fora do limite;
4. Algoritmo de coleta geracional
Este é o algoritmo mais comumente usado no momento. Sua idéia principal é dividir a memória em várias áreas diferentes de acordo com o ciclo de sobrevivência do objeto. Geralmente, a área da pilha é dividida na nova geração e na geração antiga. A característica da geração antiga é que há menos objetos que precisam ser reciclados toda vez que o lixo é coletado, enquanto há mais da nova geração, para que algoritmos diferentes sejam adotados;
Atualmente, a maior parte da nova geração usa algoritmos de cópia, mas, de fato, a nova geração não é dividida em uma proporção de 1: 1. De um modo geral, a nova geração é dividida em um espaço maior e dois espaços de sobrevivência menores. Cada vez que o espaço do Éden e um dos espaços sobreviventes são usados, quando reciclados, os objetos ainda surviving no Éden e o sobrevivente são copiados para outro espaço de sobrevivente, e depois o Éden e os espaços de sobreviventes que acabam de ser utilizados são limpos.
Como a velhice é que apenas um pequeno número de objetos é reciclado toda vez, o algoritmo de compacto de marca é geralmente usado.
Observe que há outra geração fora da área da pilha, que é a geração permanente, usada para armazenar aulas, constantes, descrições de métodos etc. A reciclagem de geração permanente recicla principalmente duas partes: constantes descartados e classes inúteis.
Então, como determinamos qual objeto é "lixo"?
Método 1. Método de contagem de referência:
Em Java, está associado a objetos por meio de referências, ou seja, se você deseja operar objetos, deve ser feito por meio de referências. Então é óbvio que uma maneira fácil é julgar se um objeto pode ser reciclado pela contagem de referência. Sem perder a generalidade, se um objeto não tiver referências associadas a ele, significa que o objeto é basicamente improvável de ser usado em outros lugares e, em seguida, o objeto se torna um objeto reciclável. Este método se torna o método de contagem de referência.
Vantagens: implementação simples e alta eficiência
Desvantagens: Incapaz de resolver o problema de referências circulares
Método 2. Método de análise de acessibilidade:
A idéia básica desse método é pesquisar em uma série de objetos "GC Roots" como ponto de partida. Se não houver um caminho acessível entre "raízes GC" e um objeto, o objeto é considerado inacessível. No entanto, deve -se notar que o objeto considerado inacessível pode não necessariamente se tornar um objeto reciclável. Um objeto que é julgado como inacessível deve passar por pelo menos dois processos de marcação para se tornar um objeto reciclável. Se ainda não houver possibilidade de se tornar um objeto reciclável durante esses dois processos de marcação, ele basicamente se tornará um objeto reciclável.
Quais objetos podem ser raízes GC?
1. Objeto referenciado na pilha JVM (tabela de variável local no quadro da pilha).
2. Objeto referenciado por atributos estáticos de classe na área do método.
3. Objetos referenciados por constantes na área do método
4. Objeto referenciado por JNI (ou seja, o método nativo geral) na pilha de métodos locais.
Para programadores, também podemos reduzir a sobrecarga do GC em alguns métodos:
1. Não exiba o método System.GC ()
2. Minimize o uso de objetos temporários
3. Quando o objeto não está em uso, a configuração de exibição é definida como nula
4. Tente usar o StringBuilder em vez de strings acumuladas de string
5. Se você pode usar tipos básicos de variáveis (int long), não use objetos (inteiro, longo)
6. Use variáveis de objeto estático o mínimo possível
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!