Wie man ein Java-Vorstellungsgespräch besteht: Fortgeschrittene Fragen und Antworten

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wie man ein Java-Vorstellungsgespräch besteht: Top-Fragen für Fortgeschrittene

\n\n

Ein Vorstellungsgespräch für die Position eines Senior Java Developers ist nicht nur eine Überprüfung der Syntax. Interviewer möchten sicherstellen, dass Sie verstehen, wie die JVM von innen funktioniert, dass Sie Multithreading-Systeme entwerfen können und die Feinheiten der Garbage Collection kennen. In diesem Artikel analysieren wir die häufigsten und schwierigsten Fragen, die Ihnen helfen, das technische Interview souverän zu bestehen.

\n\n

1. Multithreading und das Java-Speichermodell (JMM)

\n

Dies ist eines der umfangreichsten Themen. Interviewer prüfen, ob Sie verstehen, wie Threads über gemeinsamen Speicher kommunizieren und welche Probleme auftreten können.

\n\n

Frage: Was ist der Unterschied zwischen volatile und synchronized?

\n

Antwort: volatile garantiert die Sichtbarkeit von Änderungen für alle Threads, bietet aber keine Atomarität. synchronized garantiert sowohl Sichtbarkeit als auch Atomarität (sperrt den Monitor).

\n
// Beispiel für die Verwendung von volatile\npublic class VolatileExample {\n    private volatile boolean running = true;\n\n    public void stop() {\n        running = false; // Änderung ist sofort für andere Threads sichtbar\n    }\n\n    public void run() {\n        while (running) {\n            // Arbeit ausführen\n        }\n    }\n}
\n\n

Frage: Was ist happens-before im JMM?

\n

Antwort: Dies ist eine partielle Ordnungsrelation, die garantiert, dass Aktionen in einem Thread für einen anderen sichtbar sind. Zum Beispiel erzeugt das Schreiben in eine volatile-Variable ein happens-before mit dem anschließenden Lesen dieser Variable durch einen anderen Thread. Auch beim Eintreten/Verlassen eines synchronized-Blocks entsteht happens-before.

\n\n

Frage: Wie ist ConcurrentHashMap aufgebaut?

\n

Antwort: In Java 8+ verwendet ConcurrentHashMap eine Segmentierung auf Bucket-Ebene. Anstatt die gesamte Tabelle zu sperren, wird nur der jeweilige Bucket gesperrt (bei Kollisionen). Für Leseoperationen werden keine Sperren verwendet – es wird volatile-Lesen verwendet. Bei hohem Konkurrenzniveau können interne Strukturen umgebaut werden (z. B. Baum statt Liste).

\n
// Beispiel für ConcurrentHashMap\nConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();\nmap.put("key", 1);\nInteger value = map.get("key"); // Ohne Lesesperre
\n\n

2. Garbage Collection und GC-Optimierung

\n

Fragen zum Garbage Collector (GC) sind für Senior-Positionen obligatorisch. Sie müssen nicht nur die GC-Typen kennen, sondern auch, wie man sie für die Auslastung konfiguriert.

\n\n

Frage: Welche Haupttypen von GC gibt es in der HotSpot JVM?

\n

Antwort: Die wichtigsten Garbage Collector:

\n
    \n
  • Serial GC – einthreadig, für Client-Anwendungen.
  • \n
  • Parallel GC (Throughput) – multithreaded, auf Durchsatz optimiert.
  • \n
  • G1 GC (Garbage First) – Standard seit Java 9, teilt den Heap in Regionen, minimiert Pausen.
  • \n
  • ZGC und Shenandoah – Niedriglatenz-Garbage Collector mit Pausen unter 10 ms.
  • \n
\n\n

Frage: Was ist eine Stop-The-World-Pause?

\n

Antwort: Dies ist der Moment, in dem alle Anwendungsthreads angehalten werden, damit der GC seine Arbeit erledigen kann. Lange STW-Pausen sind für Echtzeitsysteme kritisch. G1 GC versucht, diese zu minimieren, indem er die Sammlung parallel und inkrementell durchführt.

\n\n

Frage: Wie erkennt man ein Speicherleck in Java?

\n

Antwort: Verwenden Sie Profiler (VisualVM, JProfiler). Beobachten Sie das Wachstum des heap dump. Typische Ursachen für Lecks: nicht freigegebene statische Collections, falsche Implementierung von equals/hashCode in HashMap, Listener, die sich nicht abmelden.

\n
// Beispiel für ein Leck: statische Collection\npublic class LeakExample {\n    private static List<byte[]> cache = new ArrayList<>();\n\n    public void addData() {\n        cache.add(new                

Blogs

Buchempfehlungen