Como passar em uma entrevista de Java: perguntas e respostas avançadas

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como passar em uma entrevista de Java: principais perguntas de nível avançado

\n\n

A 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\n

1. Multithreading e modelo de memória Java (JMM)

\n

Este é 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\n

Pergunta: Qual é a diferença entre volatile e synchronized?

\n

Resposta: 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).

\n
// 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\n

Pergunta: O que é happens-before em JMM?

\n

Resposta: É 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.

\n\n

Pergunta: Como funciona o ConcurrentHashMap?

\n

Resposta: 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).

\n
// Exemplo de ConcurrentHashMap\nConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();\nmap.put("key", 1);\nInteger value = map.get("key"); // Sem bloqueio de leitura
\n\n

2. Coleta de lixo e otimização de GC

\n

Perguntas 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\n

Pergunta: Quais são os principais tipos de GC na HotSpot JVM?

\n

Resposta: 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
\n\n

Pergunta: O que é uma pausa Stop-The-World?

\n

Resposta: É 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\n

Pergunta: Como identificar um vazamento de memória em Java?

\n

Resposta: 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.

\n
// 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                

Blogs

Book Recommendations