1. Pergunta: Se os objetos A e B são referenciados circularmente, eles podem ser GC?
Resposta: Sim, hoje as máquinas virtuais usam basicamente os algoritmos de análise de acessibilidade para determinar se o objeto sobrevive, em vez de simplesmente se referir à contagem do objeto. O algoritmo de análise de acessibilidade usa uma série de objetos "GC Roots" (objetos referenciados na pilha de máquina virtual, objetos de referência de atributo estático) como ponto de partida. Os caminhos que esses nós pesquisam para baixo são chamados de cadeias de referência. Quando um objeto não possui nenhuma conexão da cadeia de referência com as raízes GC, o objeto está comprovado que o objeto não está disponível.
2. Como o transbordamento da memória em Java é causado?
OutOfMemoryError:
(1) O Programa Espacial Pergern usa um grande número de frascos ou classes, o que faz com que a máquina virtual Java não carregue o espaço da classe insuficiente.
Solução: Ajuste os parâmetros xx: PermSize e XX: MaxPermsize, reduza os pacotes JAR e reduza o carregamento duplicado das classes.
(2) A máquina virtual Java Space Java cria muitos objetos.
Solução: Ajuste os parâmetros XMS (tamanho da pilha inicial) XMX (tamanho máximo da pilha), verifique se há loops mortos ou objetos duplicados desnecessários
(3) Não é possível criar um novo thread nativo, a JVM ocupa muito espaço de memória e a criação de threads na JVM também requer a criação de threads no sistema operacional.
Solução: redimensione os threads na JVM.
3. String S = "123"; Quantos objetos são gerados nesta declaração?
Se não houver "123" no pool de cordas, um objeto será gerado e colocado no pool constante. Se houver "123", 0 objetos serão gerados.
Se String s = new String("123") , se não houver no pool constante, crie um no pool constante e crie um na memória da heap.
4. Qual é a diferença entre erro, exceção e tempo de execução?
Erro e exceção são subclasses de Throwable e a RunTimeException é uma subclasse de exceção.
O erro é usado para indicar que um aplicativo razoável não deve tentar capturar erros.
A exceção aponta as condições que um aplicativo razoável precisa capturar. É dividido em exceções verificadas e exceções desmarcadas.
O RunTimeException é uma exceção que não é verificada, não requer a captura ou declarada no método. As principais subclasses: Nullpointer, aritmático, ArrayIndexoutOfbounds, Classcast.
5. Qual é a diferença entre o leitor e o InputStream?
São todas as classes abstratas, o leitor é usado para ler fluxos de caracteres (char ou string) e o InputStream é usado para ler fluxos de bytes (matrizes de bytes).
6. Qual é o papel do HashCode?
O HashCode é usado principalmente para pesquisas rápidas, como na estrutura de hashmap, que é usada para localizar a localização dos pares de valor-chave. Se dois objetos forem iguais, o código de hash deverá ser o mesmo, enquanto os objetos HashCode com o mesmo hashcode podem não ser os mesmos, o que é equivalente a colocá -los na mesma caixa.
7. Qual é a diferença entre hashmap e hashtable?
Segurança de thread, chave de valor nulo, eficiência, hashmap (iterador de falha rápida), hashtable (enumerator iterator) e a posição do elemento hashmap mudarão com o tempo
8. Qualquer objeto no hashmap pode ser usado como chave? Existem requisitos para objetos definidos pelo usuário como chave?
Sim, mas o objeto principal deve ser um objeto imutável. Caso contrário, após a entrada que a entrada é inserida no mapa, alterar o valor da chave fará com que o valor da chave atual seja inconsistente com o valor do hash, ou seja, ele não corresponde ao índice da matriz e não será encontrado.
9. Devo usar run () ou start () para iniciar um thread?
Como resolver o problema de sincronização e simultaneidade no multithreading? O que é um tópico de daemon? O que é um tópico de daemon? O que é um método para implementar um thread daemon (o significado de thread.setDeamon ()) Como parar um thread? Explique o que é a segurança do thread? Dê um exemplo de encadeamento inseguro. Explique o papel das palavras -chave sincronizadas. Quando um encadeamento entra em um método sincronizado de um objeto, outros threads podem inserir outros métodos desse objeto?
(1) Iniciar
(2) Herite a classe Thread, implemente a interface executável e use ExectuorService, Future e Callable para implementar o thread que retorna o valor.
(3) Método de sincronização, bloco de código de sincronização, bloqueio
(4) Os threads damon fornecem serviços para a operação de outros threads, como GC e Threads. SetDeamon (true).
(5) Thread.stop () não é recomendado (os recursos não serão lançados corretamente) e as interrupções são usadas para interromper os threads.
(6) Quando vários threads acessarem um objeto, se a programação e a execução alternativa desses encadeamentos no ambiente de tempo de execução não forem necessários, não for necessária sincronização adicional ou quaisquer outras operações de coordenação são executadas no chamador e o resultado correto pode ser obtido chamando esse objeto, então o objeto é seguro de linha.
(7) Os ingressos são vendidos repetidamente.
(8) Sincronize palavras -chave. Ao modificar os métodos estáticos, a classe é usada como objeto de bloqueio e apenas um encadeamento pode acessar esse tipo de métodos estáticos de sincronização; Ao modificar os métodos comuns, o objeto é usado como objeto de bloqueio e apenas um thread pode acessar esse tipo de métodos comuns de sincronização; Você também pode personalizar o bloco de código de sincronização do objeto de bloqueio.
(9) O método sincronizado não pode ser inserido e não sincronizado pode ser inserido.
10. Quais novos recursos do JDK8 você aprendeu e descreve os recursos correspondentes com exemplos?
(1) Expressão lambda: programação funcional, referência de método
(2) API de fluxo
(3) Método padrão de interface
(4) Melhoria da API de data e hora, adicionando o método DateTimeFormatter
11. Quais são os princípios para otimizar o SQL?
Para detalhes, consulte um blog na minha classificação de banco de dados
12. Qual é a diferença entre Serlvet e CGI no ciclo de vida do servlet?
Ciclo de vida: carregamento de classe, instanciação (Construindo objetos), inicialização (init), serviço (serviço) e destruição.
CGI: Common Gateway Interface, Common Gateway Interface, escrita no idioma Perl, cria um objeto CGI para cada solicitação.
Servlet: Somente a instanciação e a inicialização são necessárias uma vez e multi-threading.
13. Quais são as vantagens do StringBuffer? Por que rápido?
Como o StringBuffer não requer criação repetida de objetos de string, mas esse não é o caso.
Por exemplo, String S = "A" + "B" + "C" Operation Compiler Otimizará e se tornará String S = "ABC"
O compilador String S = S1 + S2 + S3 também será otimizado e se tornará uma operação de anexos Stringbuilder. No entanto, se não for splicado ao mesmo tempo + operação, o objeto String e o objeto StringBuilder serão gerados repetidamente, o que será muito baixo.
14. Você entende o algoritmo de criptografia e descriptografia?
Algoritmos abstratos: MD5 (128 bits), SHA1 (160 bits), é um processo irreversível. Não importa o tamanho dos dados, os dados do mesmo comprimento serão gerados após o algoritmo Digest. Só pode ser rachado através de dicionários.
Algoritmos de criptografia simétrica: DES, AES, a mesma chave secreta é usada ao criptografar e descriptografar.
Algoritmo de criptografia assimétrica: RSA, use diferentes teclas secretas ao criptografar e descriptografar e use RSA2 ao conectar -se a Alipay.
15. Resolva alta concorrência e alta carga?
(1) O consumo de página estática é mínimo, o HTML é estático o máximo possível e o sistema de publicação de informações CMS é usado para gerar automaticamente páginas estáticas na entrada de informações e dados dinâmicos de cache que não são alterados com frequência no front end.
(2) CDN, distribua recursos como CSS/JS em diferentes servidores.
(3) Balanceamento de carga (nginx).
(4) Dados de cache que não são alterados com frequência (Redis, Memcache).
(5) O servidor de imagem está separado do servidor de aplicativos.
(6) Cluster.
16. Cache interno inteiro?
Há uma matriz inteira estática dentro da classe Integer, que armazena alguns objetos inteiros que foram inicializados. O valor geral é (-128 ~ 127). Se você usar == comparação, às vezes falsa será retornada porque o valor não está no cache, portanto, você deve usar iguais para comparar.
17. Qual é o princípio da Arraylist?
(1) Arraylist é inseguro. Se você deseja segura de threads, use copywriteList.
(2) A camada inferior é a matriz do objeto [] e há uma referência de elemento que aponta para a matriz dentro. No início, aponta para uma matriz vazia em cache (transitória) por padrão. Quando você deseja expandir, uma nova matriz com um tamanho de 1,5 vezes (x + (x >> 1)) será renovada e, em seguida, o elemento antigo será copiado para a nova matriz através do método nativo do sistema.ArrayCopy.
(3) A complexidade do algoritmo do método aleatório de leitura e gravação (get, set) é O (1).
(4) Existem dois tipos de operações de adição. A complexidade do algoritmo de add (índice, valor) é O (n), porque precisa ser movida através da cópia de elementos; Enquanto a complexidade do algoritmo da operação ADD (valor) é O (1) (se a expansão não ocorrer).
(5) A complexidade do tempo da operação de exclusão é O (n), porque se é excluída de acordo com o índice ou o objeto, é necessário implementar a operação de movimento através da cópia. Após a exclusão, o tamanho da matriz não será alterado e o comprimento é mantido pelo atributo de tamanho. Ao excluir objetos por objeto, você não pode usar novos objetos. Você deve excluí -los por meio de referências a objetos no ArrayList.
18. Qual é o princípio da LinkedList?
(1) A camada subjacente é uma lista vinculada bidirecional, mantendo um primeiro ponteiro e um último ponteiro.
(2) A complexidade do tempo da leitura e gravação aleatória (Get, Set) é O (n).
(3) a complexidade do tempo da operação de inserção Add (Object) é O (1); A complexidade do tempo de add (índice, objeto) é O (n).
(4) a complexidade do tempo da operação de exclusão remove (objeto) é O (1); A complexidade do tempo do remover (índice) é O (n).
19. Coisas a serem observadas ao usar pools de threads?
(1) Prevenção de impasse. Todos os threads no pool de threads estão esperando o evento A ocorrer, e nenhum threads gratuito para executar A.
(2) Prevenir recursos insuficientes do sistema. Para controlar o número de threads.
(3) impedir erros simultâneos.
(4) impedir o vazamento de roscas. Um encadeamento termina de forma anormal devido à hora de execução ou erro não ser capturado normalmente, e o pool de threads perde um encadeamento.
(5) Evite sobrecarga de tarefas.
20. Qual é a diferença entre @autowire e @resource na primavera?
@Autowire é montado por tipo por padrão. Por padrão, exige que o objeto de dependência exista. Se nulo for permitido, ele pode ser definido como falso. Se quisermos usar o nome montado, podemos usá -lo em conjunto com a anotação @qualifier;
@Resource é montado pelo nome por padrão. Quando um feijão que corresponde ao nome não pode ser encontrado, ele será montado de acordo com o tipo. Pode ser especificado através do atributo de nome. Se o atributo de nome não for especificado, quando a anotação for anotada no campo, o nome do campo será considerado por padrão como o nome do feijão para encontrar o objeto de dependência. Quando a anotação é marcada no método do setter do atributo, o nome do atributo é considerado por padrão como o nome do feijão para encontrar o objeto de dependência.
21. Diagrama de transferência do estado da linha.
22. Métodos de classe de objeto?
(1) é igual: determine se é igual.
(2) HASHCODE: Encontre o valor do hash. Se os valores de hash dos dois objetos forem iguais, poderão não ser iguais; Se for igual, os valores de hash dos dois objetos devem ser iguais.
(3) ToString: Obtenha a forma de expressão da string do objeto, que geralmente é reescrito.
(4) GetClass: Método de reflexão para obter a classe à qual o objeto pertence.
(5) Espere: Ele só pode ser usado em segmentos de código sincronizado. Se o parâmetro de tempo não estiver incluído, o thread de execução fará com que o bloqueio seja abandonado e entre no estado de espera (Wait Pool).
(6) Notificar: ele só pode ser usado em segmentos de código sincronizado, retire um thread do pool de espera e coloque -o no pool de bandeira de fechadura.
(7) NotifyAll: só pode ser usado em segmentos de código sincronizado, e todos os threads são retirados do pool de espera e colocados no pool de bandeira de trava.
23. O princípio subjacente da serialização de Java?
Converter informações do objeto em informações de bytecode.
(1) Armazene a descrição da serialização. (2) Informações atuais para descrição da classe. (3) Descrição dos atributos atuais da classe. (4) Descrição da superclasse (5) Descrição do atributo de superclasse (6) Valor do atributo de superclass Descrição (7) Valor do atributo Subclasse Descrição