[Resumo de final de ano] Coleta de perguntas da entrevista de recrutamento de emprego Java 2020, recrutamento de primavera + recrutamento de outono (com respostas)

Prefácio

Quer se trate de recrutamento escolar ou recrutamento social, vários exames e exames escritos não podem ser evitados.A preparação para essas habilidades é extremamente importante. Seja um teste escrito ou um teste, existem regras a seguir. O que quero dizer com "regras a seguir" é apenas para dizer que você pode se preparar com antecedência para os testes técnicos. Este é o princípio de não travar batalhas despreparadas. a seguir é para todos, Descreve desde a preparação da entrevista até a oferta final e fornece uma lista muito detalhada. Recomenda-se lê-la desde o início. Se a base for boa, você também pode selecionar os capítulos que deseja ver

A diferença entre Redis e memcached;

  • Método de armazenamento: o memcache armazenará todos os dados na memória e desligará após uma queda de energia, e os dados não podem exceder o tamanho da memória. Parte dos dados do redis são armazenados no disco rígido, o que pode garantir a durabilidade dos dados.

  • Tipo de suporte de dados: Memcache oferece suporte a tipos de dados simples, apenas com suporte a valor-chave simples, enquanto o redis oferece suporte a cinco tipos de dados.

  • O modelo subjacente é diferente: a implementação subjacente entre eles e o protocolo do aplicativo para comunicação com o cliente é diferente. O Redis construiu diretamente o mecanismo da VM por si só, porque o sistema geral chama funções do sistema, ele vai perder um certo tempo para mover e solicitar.

  • O tamanho do valor: redis pode alcançar 1 GB, enquanto o memcache tem apenas 1 MB.

Quais algoritmos de coleta de lixo você conhece?

  • Copiar: primeiro suspenda a execução do programa e, a seguir, copie todos os objetos sobreviventes do heap atual para outro heap. Todos os objetos que não foram copiados são lixo. Quando os objetos são copiados para o novo heap, eles ficam próximos uns dos outros, de modo que o novo heap permanece compactado e pode ser alocado de forma simples e direta de acordo com o método mencionado acima. A desvantagem é que ele desperdiça espaço e tem que ir e voltar entre as duas pilhas. A segunda é que quando o programa entra em um estado estável, ele pode produzir apenas muito pouco lixo, ou mesmo nenhum lixo. No entanto, o coletor de cópia ainda vai toda a memória.Copiar de um lugar para outro.

  • Mark-Clear: também começa na pilha e na área de armazenamento estático, percorre todas as referências e, em seguida, encontra todos os objetos sobreviventes. Sempre que encontrar um objeto sobrevivente, ele dará uma marca ao objeto, e nenhum objeto será reciclado neste processo. Somente quando todo o trabalho de marcação for concluído, a ação de limpeza começará. Durante o processo de limpeza, os objetos não marcados serão liberados e nenhuma cópia ocorrerá. Portanto, o espaço de heap restante não é contínuo, se o coletor de lixo quiser obter espaço contínuo, ele terá que reorganizar os objetos restantes.

  • Classificação de marcação: seu primeiro estágio é exatamente o mesmo que o algoritmo de marcação / varredura, que é atravessar as raízes do GC e então marcar os objetos sobreviventes. Mova todos os objetos sobreviventes e organize-os em ordem de endereço de memória e, em seguida, recupere toda a memória após o endereço de memória final. Portanto, a segunda fase é chamada de fase de acabamento.

  • Algoritmo de coleta geracional: divida o heap Java na nova e na velha geração e, a seguir, use o algoritmo de coleta mais apropriado de acordo com as características de cada geração. Na nova geração, a taxa de sobrevivência do objeto é relativamente baixa, então o algoritmo de replicação é selecionado. Na geração anterior, a taxa de sobrevivência do objeto é alta e não há espaço extra para alocá-lo, então a "marca- O algoritmo clear "ou" mark-sort "é usado para reciclagem.

Como controlar a prioridade dos threads do pool de threads?

  • Resposta: Mude o pool de threads existente para uma fila prioritária

Pós-processador do Spring;

  • BeanPostProcessor: Pós-processador do bean, que funciona principalmente antes e depois da inicialização do bean.

  • InstantiationAwareBeanPostProcessor: Herdado de BeanPostProcessor, ele funciona principalmente antes e depois da instanciação do bean; AOP cria objetos proxy através desta interface.

  • BeanFactoryPostProcessor: O pós-processador do Bean Factory, que é executado depois que as definições do bean são carregadas e o bean não é inicializado.

  • BeanDefinitionRegistryPostProcessor: herdado de BeanFactoryPostProcessor. Seu método customizado postProcessBeanDefinitionRegistry será executado antes que as definições do bean estejam prestes a serem carregadas e o bean não tenha sido inicializado, ou seja, ele será chamado antes do método postProcessBeanFactory de BeanFactoryPostProcessor.

Quando a consulta não vai para o índice (esperado)?

  • Consulta difusa% gosto

  • A coluna de índice participa do cálculo e usa a função

  • Ordem de prefixo não mais à esquerda

  • onde julgar nulo

  • onde não é igual

  • A operação ou tem pelo menos um campo sem índice

  • O conjunto de resultados da consulta a ser retornado à tabela é muito grande (excedendo o intervalo configurado)

GC 中 Pare o mundo (STW)

  • Quando o algoritmo de coleta de lixo é executado, todos os outros encadeamentos do aplicativo Java, exceto o encadeamento do coletor de lixo, são suspensos. Neste momento, o sistema só pode permitir que o encadeamento do GC seja executado, e todos os outros encadeamentos serão suspensos, aguardando que o encadeamento do GC seja executado antes de executar novamente. Essas tarefas são iniciadas automaticamente e concluídas pela máquina virtual em segundo plano. Ela interrompe todos os threads de trabalho normal do usuário quando ele não está visível. Isso é para muitos aplicativos, especialmente aqueles com requisitos elevados de tempo real. O procedimento é inaceitável.

  • Mas isso não significa que o GC deve ser STW, você também pode optar por reduzir a velocidade de execução, mas pode ser executado simultaneamente algoritmo de coleta, depende do seu negócio.

Qual é a diferença entre o coletor G1 e o coletor CMS?

  • O coletor CMS é um coletor cujo objetivo é obter o menor tempo de pausa de recuperação, porque quando o CMS está funcionando, o thread de trabalho do GC e o thread do usuário podem ser executados simultaneamente para atingir o objetivo de reduzir o tempo de pausa do telefone móvel (apenas o inicial marcação e remarcação serão STW). Mas o coletor CMS é muito sensível aos recursos da CPU. Na fase simultânea, embora o thread do usuário não seja paralisado, ele consumirá recursos da CPU e fará com que o programa de referência fique lento e a taxa de transferência geral caia.

  • O CMS funciona apenas na geração anterior e é baseado no algoritmo de varredura de marcas, portanto, haverá muitos fragmentos de espaço durante o processo de limpeza.

  • O coletor CMS não pode lidar com lixo flutuante. Como o thread do usuário ainda está em execução durante a fase de limpeza simultânea do CMS, novo lixo continuará a ser gerado conforme o programa é executado espontaneamente. Esta parte do lixo aparece após o processo de marcação e o O CMS não pode ser processado nesta coleção. Eles devem ser limpos no próximo GC.

  • G1 é um coletor de lixo orientado para aplicações de servidor, adequado para sistemas de servidor com processadores multi-core e grande capacidade de memória. O G1 pode aproveitar ao máximo as vantagens de hardware da CPU e do ambiente multi-core e usar várias CPUs (CPU ou núcleo da CPU) para reduzir o tempo de pausa STW. Satisfaz uma pausa curta enquanto alcança um alto rendimento.

  • Desde o JDK 9, G1 se tornou o coletor de lixo padrão. G1 é muito adequado quando o aplicativo tem qualquer uma das seguintes características: A duração total do GC é muito longa ou muito frequente; a taxa de criação e a taxa de sobrevivência de objetos mudam muito; o aplicativo não quer pausar por muito tempo (mais de 0,5 s ou mesmo 1s).

  • G1 divide o espaço em várias regiões (Região), e então eles são recuperados separadamente. Ele pode ser usado quando o heap é relativamente grande e o algoritmo de replicação é adotado e o problema de fragmentação não é sério. No geral, ele pertence ao algoritmo de rotulagem, e o local (entre regiões) pertence ao algoritmo de replicação.

  • G1 precisa de um conjunto de memória (especificamente, uma tabela de cartão) para registrar a relação de referência entre a nova geração e a geração antiga. Esta estrutura de dados requer uma grande quantidade de memória em G1, que pode chegar a 20% ou mais de toda a memória heap capacidade. Além disso, o custo de manutenção da memória configurada em G1 é maior, o que traz maior carga de execução e afeta a eficiência. Portanto, o CMS tem um desempenho melhor que o G1 em aplicativos de memória pequena e o G1 tem mais vantagens em aplicativos de memória grande.O tamanho da memória está entre 6 GB e 8 GB.

Estrutura de dados da teoria AQS

  • Existem 3 objetos no AQS, um é o estado (usado para contadores, semelhante ao contador de reciclagem do gc), um é a marca de thread (que bloqueia a thread atual) e um é a fila de bloqueio.

Modelo de Delegação Parental

  • Delegação dos pais significa que, se um carregador de classes precisar carregar uma classe, ele primeiro delegará a solicitação da classe ao carregador de classes pai para concluí-la.Este é o caso em cada nível. Recursivamente para o nível superior, quando o carregador pai não consegue completar a solicitação, a classe filha tenta carregar.

Relacionamento entre JDBC e Modelo de Delegação Parental

  • Como o carregador de classes é limitado pelo intervalo de carregamento, em alguns casos, o carregador de classes pai não pode carregar o arquivo necessário e, em seguida, é necessário delegar o carregador de subclasses para carregar o arquivo de classe.

Fale sobre a diferença entre -synchronized e reentrantlock-

  • Em primeiro lugar, synchronized é uma palavra-chave embutida de java.No nível jvm, Lock é uma classe java.

  • Sincronizado não pode determinar se deve adquirir o status de bloqueio, o bloqueio pode determinar se o bloqueio foi adquirido e pode tentar ativamente adquirir o bloqueio.

  • Synchronized irá liberar automaticamente o bloqueio (um thread irá liberar o bloqueio após a execução do código de sincronização; b irá liberar o bloqueio se ocorrer uma exceção durante a execução do thread), o Lock deve ser liberado manualmente no método finally (unlock () libera o travar), caso contrário, isso fará com que a linha trave facilmente.

  • Duas threads 1 e 2 com a palavra-chave synchronized, se a thread atual 1 obtiver o bloqueio, a thread 2 espera. Se o encadeamento 1 estiver bloqueado, o encadeamento 2 aguardará para sempre e o bloqueio de bloqueio não necessariamente esperará para sempre. Se o bloqueio não puder ser adquirido, o encadeamento pode terminar sem esperar.

  • Os bloqueios sincronizados podem ser reentrantes, ininterruptos e injustos, enquanto os bloqueios podem ser reentrantes, julgados e justos (ambos)

  • Os bloqueios de bloqueio são adequados para problemas de sincronização com um grande número de códigos sincronizados e os bloqueios de sincronização são adequados para problemas de sincronização com uma pequena quantidade de códigos.

Parâmetros do pool de thread principal ThreadPoolExecutor;

  • corePoolSize: especifica o número de threads no pool de threads.

  • maximumPoolSize: especifica o número máximo de threads no pool de threads.

  • keepAliveTime: O tempo ocioso permitido pelos threads de manutenção do pool de threads.

  • unit: a unidade de keepAliveTime.

  • workQueue: fila de tarefas, tarefas que foram enviadas, mas ainda não executadas.

  • threadFactory: Thread factory, usado para criar threads, geralmente usa o padrão.

  • manipulador: Estratégia de rejeição. Quando há muitas tarefas para lidar, como rejeitá-las.

Fluxo de trabalho ThreadPoolExecutor

  • As regras de execução de thread do pool de threads têm muito a ver com a fila de tarefas.

  • O seguinte pressupõe que não há limite de tamanho na fila de tarefas:

  • Se o número de threads <= o número de threads principais, inicie diretamente um thread principal para executar a tarefa e não será colocado na fila.

  • Se o número de threads> o número de threads principais, mas <= o número máximo de threads, e a fila de tarefas for LinkedBlockingDeque, as tarefas que excederem o número de threads principais serão enfileiradas na fila de tarefas.

  • Se o número de threads> o número de threads principais, mas <= o número máximo de threads e a fila de tarefas for SynchronousQueue, o pool de threads criará novas threads para executar tarefas e essas tarefas não serão colocadas na fila de tarefas . Esses threads são threads não principais. Após a conclusão da tarefa, o tempo ocioso atinge o período de tempo limite e será limpo.

  • Se o número de threads> o número de threads principais e> o número máximo de threads, quando a fila de tarefas for LinkedBlockingDeque, as tarefas que excederem os threads principais serão enfileiradas na fila de tarefas. Ou seja, quando a fila de tarefas é LinkedBlockingDeque e não há limite de tamanho, a configuração do número máximo de encadeamentos do conjunto de encadeamentos é inválida e o número de encadeamentos não excederá o número de encadeamentos principais no máximo.

  • Se o número de threads> o número de threads principais e> o número máximo de threads, quando a fila de tarefas for SynchronousQueue, uma exceção será lançada porque o pool de threads se recusa a adicionar tarefas.

Quando o tamanho da fila de tarefas é limitado:

  • Quando LinkedBlockingDeque estiver cheio, a nova tarefa criará diretamente um novo encadeamento para execução e uma exceção será lançada quando o número de encadeamentos criados exceder o número máximo de encadeamentos.

  • Não há limite para o número de SynchronousQueue. Porque ele não mantém essas tarefas, mas as entrega diretamente ao pool de threads para execução. Quando o número de tarefas excede o número máximo de threads, uma exceção é lançada diretamente.

Resumindo

Finalmente, preparei os materiais de aprendizagem da arquitetura Java para todos. O conteúdo da tecnologia de aprendizagem inclui: Spring, Dubbo, MyBatis, RPC, análise de código-fonte, alta simultaneidade, alto desempenho, distribuído, otimização de desempenho, desenvolvimento de arquitetura avançada de microsserviço, etc. Amigos necessitados, clique aqui para comentar o csdn e faça o download você mesmo ! Como desenvolvedor, sem falar que você deve ser o melhor do setor, mas também deve garantir que não seja eliminado pelo mercado.Aprender é o mais básico para os programadores.

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/jiagouwgm/article/details/111798553
Recomendado
Clasificación