Como passar em uma entrevista de Java: principais perguntas de nível avançado
\n\nA entrevista para a posição de Senior Java Developer não é apenas uma verificação de sintaxe. Os entrevistadores querem ter certeza de que você entende como a JVM funciona internamente, sabe projetar sistemas multithread e conhece os detalhes da coleta de lixo. Neste artigo, analisaremos as perguntas mais frequentes e difíceis que o ajudarão a passar com confiança na entrevista técnica.
\n\n1. Multithreading e modelo de memória Java (JMM)
\nEste é um dos tópicos mais abrangentes. Os entrevistadores verificam se você entende como as threads interagem através da memória compartilhada e quais problemas podem surgir.
\n\nPergunta: Qual é a diferença entre volatile e synchronized?
\nResposta: volatile garante a visibilidade das alterações para todas as threads, mas não garante atomicidade. synchronized garante tanto visibilidade quanto atomicidade (bloqueia o monitor).
// Exemplo de uso de volatile\npublic class VolatileExample {\n private volatile boolean running = true;\n\n public void stop() {\n running = false; // A alteração é imediatamente visível para outras threads\n }\n\n public void run() {\n while (running) {\n // execução do trabalho\n }\n }\n}\n\nPergunta: O que é happens-before em JMM?
\nResposta: É uma relação de ordem parcial que garante que as ações em uma thread sejam visíveis para outra. Por exemplo, escrever em uma variável volatile cria um happens-before com a leitura subsequente dessa variável por outra thread. Também ocorre happens-before ao entrar/sair de um bloco synchronized.
Pergunta: Como funciona o ConcurrentHashMap?
\nResposta: No Java 8+, o ConcurrentHashMap usa segmentação no nível de buckets. Em vez de bloquear toda a tabela, apenas o bucket específico é bloqueado (em caso de colisões). Para operações de leitura, não são usados bloqueios — é usada leitura volatile. Em alto nível de concorrência, as estruturas internas podem ser reorganizadas (por exemplo, árvore em vez de lista).
// Exemplo de ConcurrentHashMap\nConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();\nmap.put("key", 1);\nInteger value = map.get("key"); // Sem bloqueio de leitura\n\n2. Coleta de lixo e otimização de GC
\nPerguntas sobre Garbage Collector (GC) são obrigatórias para posições Sênior. Você precisa conhecer não apenas os tipos de GC, mas também como configurá-los para a carga de trabalho.
\n\nPergunta: Quais são os principais tipos de GC na HotSpot JVM?
\nResposta: Os principais coletores:
\n- \n
- Serial GC — single-thread, para aplicações cliente. \n
- Parallel GC (Throughput) — multi-thread, focado em throughput. \n
- G1 GC (Garbage First) — padrão desde Java 9, divide o heap em regiões, minimiza pausas. \n
- ZGC e Shenandoah — coletores de baixa latência com pausas inferiores a 10 ms. \n
Pergunta: O que é uma pausa Stop-The-World?
\nResposta: É o momento em que todas as threads da aplicação são pausadas para que o GC possa realizar seu trabalho. Pausas STW longas são críticas para sistemas em tempo real. O G1 GC tenta minimizá-las, realizando a coleta de forma paralela e incremental.
\n\nPergunta: Como identificar um vazamento de memória em Java?
\nResposta: Use profilers (VisualVM, JProfiler). Monitore o crescimento do heap dump. Causas típicas de vazamentos: coleções estáticas não liberadas, implementação incorreta de equals/hashCode em HashMap, listeners que não são removidos.
// Exemplo de vazamento: coleção estática\npublic class LeakExample {\n private static List<byte[]> cache = new ArrayList<>();\n\n public void addData() {\n cache.add(new