Os programadores de 2020 devem ver essas perguntas da entrevista de alta frequência JVM e integração de pontos de conhecimento!

Embora existam muitos tipos de materiais relacionados a JVM no mercado, obviamente existem dois extremos: muito espasmódicos e difíceis de entender, ou é um ponto técnico e não sistemático. Ao mesmo tempo, as principais empresas estão prestando cada vez mais atenção à promoção e ao desenvolvimento de tecnologias relacionadas à JVM, e o conhecimento da JVM agora é um assunto obrigatório para entrevistas técnicas com os principais fabricantes.

Neste contexto, classifiquei de forma abrangente o conhecimento e a experiência de aprendizagem sistemática de JVM, incluindo tecnologia JVM e modelo de memória, parâmetros JVM e ferramentas integradas, algoritmo de GC, log de GC, memória e encadeamento e outras análises de resolução de problemas relacionados, bem como análises de resolução de problemas comuns Métodos avançados e avançados de combate real, como a análise aprofundada das perguntas da entrevista, não apenas atendem às necessidades de todos para um aprendizado rápido e sistemático e conhecimento abrangente, mas também levam em consideração o aconselhamento sobre a experiência de entrevista de todos. Clique aqui se precisar ! ! Cifra CSDN

Perguntas da entrevista JVM

1. Modelo de memória e partições, você precisa detalhar o que colocar em cada área.

2. Partições na pilha: Eden, sobrevivência (de + para), velhice, suas próprias características.

3. Método de criação de objetos, alocação de memória de objetos, localização de acesso a objetos.

4. Dois métodos de julgamento de GC: 

5. O que é SafePoint

6. Os três métodos de coleta de GC: os princípios e características de remoção de marcas, classificação de marcas e algoritmos de cópia. Onde eles são usados? Se você for solicitado a otimizar o método de coleta, que ideias você tem?

7. Quais são os coletores de GC? Recursos do coletor CMS e coletor G1.

8. Quando ocorre o GC secundário e o GC completo, respectivamente?

9. Várias ferramentas de depuração de memória comumente usadas: jmap, jstack, jconsole, jhat

10. Vários processos de carregamento de classe:

11. Em quais áreas a memória JVM está dividida e qual é a função de cada área?

12. Como julgar se um objeto está vivo? (Ou como julgar objetos GC)

13. Descreva resumidamente o mecanismo de coleta de lixo do java?

14. Quais são os métodos de coleta de lixo em java?

15. Modelo de Memória Java

16. Processo de carregamento da classe java?

17. Descreva resumidamente o mecanismo de carregamento da classe java?

18. O mecanismo de modelo de delegação pai do carregador de classes?

19. O que são carregadores de classes e quais são os carregadores de classes?

20. Descreva resumidamente a estratégia de alocação e recuperação de memória java e GC secundário e GC principal

21. Como obter a memória usada pelo programa Java? Que porcentagem da pilha é usada?

22. Qual é a diferença entre heap e stack em Java?

23. Descreva o princípio e o mecanismo de carregamento de arquivos de classe da JVM?

24. Qual é o mecanismo de carregamento da classe Tomcat?

25. Qual é a estrutura do heap Java?

26. O que é ajuste de GC?

27. Descreva resumidamente as mudanças na área de memória de cada versão?

28. Haverá vazamentos de memória em Java, brevemente?

29. As vantagens e princípios da coleta de lixo, e considere 2 tipos de mecanismos de reciclagem? Qual é o princípio básico?

30. O que é coleta de lixo distribuída (DGC)? Como funciona?

31. Conte-me sobre a avaliação de desempenho e os indicadores de teste que você entende?

32. Quais são os métodos de otimização de desempenho comumente usados?

32. Fale sobre cache distribuído e hashing consistente?

 

Pontos de conhecimento JVM

** JVM **

(1) Conceitos básicos:
JVM é um computador hipotético que pode executar código Java, incluindo um conjunto de instruções de bytecode, um conjunto de registradores, uma pilha, uma coleta de lixo, um heap e um domínio de método de armazenamento. JVM é executado no sistema operacional, não tem interação direta com o hardware.
! [Insira a descrição da imagem aqui] (https://img-blog.csdnimg.cn/20201204160947865.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shasha_10,text_aHR0cHM6Ly9ibG9nLmLm6Ly9ibG9nLmLmVAGLy9ibG9nLm4Nz870M6Ly9ibG9nLm4NzBlm6Ly9mVpdGk,shadows_10,text_aHR0cHM6Ly9mZ0ZnLmVAGColor0NzDzLm6Ly9mVPdGk ,shadows

(2) Processo de operação:
Todos nós conhecemos os arquivos fonte Java. Por meio do compilador, podemos produzir os arquivos .Class correspondentes, que são arquivos bytecode, e os arquivos bytecode são compilados em arquivos específicos por meio do interpretador na máquina virtual Java. O código de máquina na máquina. É o seguinte: ① Arquivo de origem Java —-> Compilador —-> Arquivo Bytecode ode Arquivo Bytecode —-> JVM —-> Código de máquina O interpretador de cada plataforma é diferente, mas a máquina virtual implementada é Da mesma forma, esta é a razão pela qual Java pode ser multiplataforma.Quando um programa é executado desde o início, a máquina virtual começa a ser instanciada e existem várias instâncias de máquina virtual quando vários programas são iniciados. Quando o programa é encerrado ou fechado, a instância da máquina virtual morre e os dados não podem ser compartilhados entre várias instâncias da máquina virtual.


** 2. Thread **
O thread mencionado aqui se refere a uma entidade de thread durante a execução do programa. A JVM permite que um aplicativo execute vários threads simultaneamente. O encadeamento Java no Hotspot JVM tem um relacionamento de mapeamento direto com o encadeamento do sistema operacional nativo . Quando o armazenamento local do thread, alocação de buffer, objetos de sincronização, pilhas, contadores de programa, etc. estão prontos, um thread nativo do sistema operacional é criado. O encadeamento Java termina e o encadeamento nativo é reciclado. O sistema operacional é responsável por agendar todos os threads e atribuí-los a qualquer CPU disponível. Quando o encadeamento nativo é inicializado, o método run () do encadeamento Java é chamado. Quando o encadeamento terminar, todos os recursos do encadeamento nativo e do encadeamento Java serão liberados .

Os threads do sistema em execução em segundo plano do HotspotJVM incluem principalmente o seguinte:

Encadeamento da VM: este encadeamento espera que a JVM alcance um ponto seguro e a operação ocorra. Essas operações devem ser executadas em um encadeamento separado, porque quando a modificação do heap não pode ser executada, o encadeamento requer que a JVM esteja em um ponto seguro. Os tipos dessas operações são: coleta de lixo stop-the-world, despejo de pilha de encadeamentos, suspensão de encadeamentos, liberação de bloqueio tendencioso de encadeamento (bloqueio tendencioso).

Thread de tarefa periódica: Este thread é responsável por eventos de timer (ou seja, interrupções) e é usado para agendar a execução de operações periódicas.

Encadeamentos GC: esses encadeamentos suportam diferentes atividades de coleta de lixo na JVM.

Threads do compilador: esses threads compilam dinamicamente o bytecode em código de máquina relacionado à plataforma local em tempo de execução.

Encadeamento de distribuição de sinal: este encadeamento recebe o sinal enviado para a JVM e chama o método JVM apropriado para processamento

3. Área de memória JVM

A área de memória da JVM é dividida principalmente em área privada de encadeamento [contador de programa, pilha de máquina virtual, área de método local], área de encadeamento compartilhada [heap JAVA, área de método] e memória direta. O ciclo de vida da área de dados privados do encadeamento é igual ao do encadeamento.

Ele é criado / destruído dependendo do início / fim da thread do usuário (no HotspotVM, cada thread é mapeada diretamente com a thread local do sistema operacional, de modo que a área de memória desta parte da área de memória corresponde à vida / morte da thread local).

 

A área compartilhada do thread é criada / destruída com a inicialização / desligamento da máquina virtual.

A memória direta não faz parte da área de dados de tempo de execução da JVM, mas também é usada com frequência: NIO introduzido no JDK 1.4 fornece um método IO baseado em Canal e Buffer. Ele pode usar a biblioteca de função Nativa para alocar diretamente a memória fora do heap e, em seguida, usá-la. O objeto DirectByteBuffer opera como uma referência a essa memória (consulte: Java I / O Extension), o que evita a cópia de dados entre o heap Java e o heap nativo, portanto, o desempenho pode ser significativamente melhorado em alguns cenários.

3. Contador de programa (thread privado)

Um pequeno espaço de memória é o indicador de número de linha do bytecode executado pelo thread atual. Cada thread deve ter um contador de programa independente. Este tipo de memória também é chamado de memória "thread-privada". Se o método java estiver sendo executado, o contador registra o endereço da instrução bytecode da máquina virtual (o endereço da instrução atual). Se ainda for um método nativo, ele estará vazio. Esta área de memória é a única área que não especifica nenhuma condição OutOfMemoryError na máquina virtual.

4 pilha de máquina virtual (thread privada)

É um modelo de memória que descreve a execução de métodos java.Cada método irá criar um stack frame (Stack Frame) para armazenar a tabela de variáveis ​​locais, pilha de operandos, link dinâmico, exportação de método e outras informações durante a execução. O processo de cada método, desde a invocação até a conclusão da execução, corresponde ao processo de enviar um frame de pilha na pilha da máquina virtual para sair da pilha.

Stack frame (Frame) é uma estrutura de dados usada para armazenar dados e resultados parciais do processo. Também é usada para lidar com vinculação dinâmica, valores de retorno de método e exceção de despacho. O frame da pilha é criado quando o método é chamado e destruído quando o método termina - se o método é concluído normalmente ou anormalmente (lançando uma exceção não capturada dentro do método) é contado como o fim do método.

5. Área de método local (tópico privado)

A área de método local é semelhante à pilha Java. A diferença é que a pilha de máquina virtual serve para executar métodos Java, enquanto a pilha de método local serve métodos nativos. Se uma implementação de VM usa o modelo de ligação C para oferecer suporte a chamadas nativas, a pilha será Uma pilha C, mas o HotSpot VM combina diretamente a pilha do método local e a pilha da máquina virtual em uma.


6. Heap (compartilhamento de thread de pilha) -área de dados de tempo de execução


É uma área de memória compartilhada por threads.Os objetos e arrays criados são armazenados na memória heap Java.Também é a área de memória mais importante para a coleta de lixo pelo coletor de lixo. Devido ao algoritmo de coleta geracional usado pelas VMs modernas, o heap Java também pode ser subdividido na nova geração (área do Éden, área do sobrevivente e área do sobrevivente) e a geração antiga da perspectiva do GC.
 

7. Área de método l geração permanente (compartilhamento de thread)


Ou seja, a geração permanente que costumamos dizer é usada para armazenar dados como informações de classe, constantes, variáveis ​​estáticas e código compilado pela JVM carregado pela JVM. HotSpot VM estende a coleção de geração de GC para a área de método, a saber Use a geração permanente do heap Java para implementar a área do método, de modo que o coletor de lixo do HotSpot possa gerenciar esta parte da memória como o heap Java, sem ter que desenvolver um gerenciador de memória especial para a área do método (o objetivo principal da recuperação da memória permanente é Para a recuperação da piscina constante e o descarregamento dos tipos, os benefícios são geralmente pequenos).
Runtime Constant Pool faz parte da área de método. Além da descrição da versão, campos, métodos, interfaces, etc. da classe no arquivo de classe, há também um pool constante
(Constant Pool Table), que é usado para armazenar várias referências literais e simbólicas geradas durante a compilação. O conteúdo será armazenado no pool de constantes de tempo de execução na área do método após o carregamento da classe. A máquina virtual Java tem regulamentos rígidos sobre o formato de cada parte do arquivo de classe (incluindo naturalmente o pool constante). Os tipos de dados que cada byte é usado para armazenar devem atender aos requisitos da especificação, para que possam ser reconhecidos pela máquina virtual. Carregue e execute.
 

8. Memória de tempo de execução JVM

Do ponto de vista do GC, o heap Java também pode ser subdividido em: a geração jovem (área de Éden, área de Sobrevivente e área de Sobrevivente) e a geração antiga.

2.3.1. Recém-nascido

É usado para armazenar novos objetos. Geralmente ocupa 1/3 da pilha. Devido à criação frequente de objetos, a geração jovem frequentemente acionará o MinorGC para coleta de lixo. A nova geração está dividida em três áreas: Eden, ServivorFrom e ServivorTo.

1. O local de nascimento do novo objeto Java na área do Éden (se o objeto recém-criado ocupar muita memória, ele é alocado diretamente para a geração anterior). Quando a memória na área Eden é insuficiente, MinorGC é acionado para realizar uma coleta de lixo na área da geração jovem.

2. SerivorDo sobrevivente do último CG, como a pessoa digitalizada deste CG.

3.ServivorTo retém os sobreviventes de um processo MinorGC.

4. O processo de MinorGC (copiar -> vazio -> trocar) MinorGC usa um algoritmo de cópia.

1: Copiar eden e servicorFrom para ServicorTo, idade +1.
Primeiro, copie os objetos sobreviventes na área Eden e ServivorFrom para a área ServicorTo (se houver a idade do objeto e atingir o padrão de velhice, ele é atribuído à área de geração anterior), e ao mesmo tempo A idade desses objetos é +1 (se ServicorTo não for suficiente, coloque-o na área antiga);
2: Limpe eden, servantFrom
e, em seguida, limpe os objetos em Eden e ServicorFrom;
3: ServicorTo e ServicorFrom são trocados
Finalmente, ServicorTo e ServicorFrom são trocados, O ServicorTo original se torna a área ServicorFrom no próximo GC.

9. Velhice

Armazene principalmente objetos de memória com longos ciclos de vida no aplicativo.
Objetos na velhice são relativamente estáveis, então MajorGC não será executado com frequência. Antes do MajorGC, um MinorGC geralmente é executado primeiro, para que os objetos da nova geração sejam promovidos para a geração anterior, que dispara quando o espaço não é suficiente. Quando um espaço contíguo grande o suficiente não pode ser encontrado para ser alocado a um objeto maior recém-criado, um MajorGC será acionado com antecedência para que a coleta de lixo libere espaço.
MajorGC usa um algoritmo de varredura de marcas: primeiro verifique todas as gerações antigas uma vez, marque os objetos sobreviventes e, em seguida, recupere os objetos não marcados. MajorGC leva muito tempo porque precisa ser digitalizado e reciclado. MajorGC irá gerar fragmentação de memória. Para reduzir o consumo de memória, geralmente precisamos mesclar ou marcá-lo para alocação direta na próxima vez. Quando a idade avançada está muito cheia para caber, ele lançará uma exceção OOM (Out of Memory).
 

10. Geração permanente


Refere-se à área de armazenamento permanente da memória, que armazena principalmente as informações de Classe e Meta (metadados). A classe é colocada na área permanente quando é carregada. É diferente da área onde a instância está armazenada. O GC não será permanente durante o tempo de execução do programa principal. A área está limpa. Portanto, isso também faz com que a área de geração permanente seja preenchida com o aumento da classe carregada e, eventualmente, lance uma exceção OOM.

11. Coleta de lixo e algoritmos

12 Como determinar o lixo


1. Método de contagem de referências
Em Java, referências e objetos estão relacionados. Se você deseja manipular objetos, você deve usar referências. Portanto, é óbvio que uma maneira simples é julgar se um objeto pode ser reciclado por contagem de referência. Simplificando, se um objeto não tem nenhuma referência associada a ele, ou seja, sua contagem de referência não é О, isso significa que é improvável que o objeto seja usado novamente, então o objeto é um objeto reciclável.


2. Análise de
acessibilidade Para resolver o problema de referência circular do método de contagem de referência, Java usa o método de análise de acessibilidade. Pesquise uma série de objetos "raízes GC" como ponto de partida. Se não houver um caminho alcançável entre as "raízes GC" e um objeto, o objeto é considerado inalcançável. Deve-se notar que um objeto inacessível não é equivalente a um objeto reciclável, e um objeto inalcançável deve passar por pelo menos dois processos de marcação para se tornar um objeto reciclável. Se o objeto ainda for reciclável após ter sido marcado duas vezes, ele será reciclado.

13. Algoritmo Mark-Sweep (Mark-Sweep)


O algoritmo de coleta de lixo mais básico é dividido em dois estágios, marcação e limpeza. A fase de marcação marca todos os objetos que precisam ser recuperados e a fase de limpeza recupera o espaço ocupado pelos objetos marcados. Como mostrado

Pela figura, podemos descobrir que o maior problema desse algoritmo é a séria fragmentação da memória, e o problema de que objetos grandes não conseguem encontrar espaço utilizável pode ocorrer mais tarde.

Resumindo

Todas as perguntas da entrevista não são estáticas, principalmente como os fabricantes de primeira linha. As perguntas da entrevista real acima são apenas uma referência para todos. O mais importante é aumentar sua reserva de conhecimento e estar preparado.

Gostaria de compartilhar com vocês os materiais compilados de perguntas da entrevista JVM em 2019 (mais de 20 páginas de documentos pdf) e mais de 100 páginas de documentos pdf de perguntas da entrevista java de muitas empresas e rotas de aprendizagem de vários pontos de conhecimento. Mapas do cérebro da mente (xmind) e vídeos explicativos da JVM . Você pode clicar aqui se precisar ! ! ! Cifra CSDN

 

A entrevista JVM mais completa com fabricantes de primeira linha em 2019 é de 100 perguntas!  Quanto você pode responder corretamente?

 

 

Acho que você gosta

Origin blog.csdn.net/weixin_47345084/article/details/110654757
Recomendado
Clasificación