Interviewfrage für Java-Entwickler

Ein Service startet alle paar Tage mit einem OutOfMemoryError neu. Wie findest du die Ursache?

Worauf der Interviewer abzielt, wie du deine Antwort aufbaust und ein gesprochenes Beispiel zum Anpassen.

Kurzantwort

Lies zuerst die Meldung, denn Heap Space, Metaspace, Direct Buffer und GC Overhead Limit Exceeded zeigen auf sehr unterschiedliche Ursachen. Lass den Prozess mit Heap Dump on Out of Memory laufen, damit du den Zustand beim Fehler festhältst, öffne den Dump dann in einem Memory Analyzer und schau in den Dominator Tree, um zu sehen, was am meisten hält. Vergleich Dumps über die Zeit, um ein echtes Leak von einem Working Set zu trennen, das schlicht größer ist als der Heap.

Warum Interviewer das fragen

Der Interviewer will eine wiederholbare Methode und Vertrautheit mit dem Werkzeug sehen. Die Fehlervarianten zu unterscheiden ist ein schnelles Glaubwürdigkeitssignal, ebenso wie die üblichen Verdächtigen zu kennen: unbegrenzte Caches, Thread Locals auf gepoolten Threads, Class-Loader-Leaks beim Redeploy und Queries, die eine ganze Tabelle materialisieren. Sie prüfen außerdem, ob du nicht einfach den Heap vergrößerst und es für erledigt erklärst.

So baust du deine Antwort auf

  • Lies die konkrete Fehlervariante, bevor du Theorien baust.
  • Sichere beim Fehler automatisch einen Heap Dump.
  • Analysiere Retained Size und den Dominator Tree, nicht flache Zählungen.
  • Bestätige den Fix mit einem begrenzten Cache oder einer gestreamten Query, dann verifizieren.

Beispielantwort

Gesprochenes Beispiel, erste Person

Die Variante zählt. Java Heap Space heißt, lebende Objekte füllen den Heap wirklich, Metaspace heißt, Klassen werden geladen und nie freigegeben, und ein Direct-Buffer-Fehler zeigt auf NIO oder eine native Bibliothek statt auf meine Objekte. Das lese ich also zuerst und stelle dann sicher, dass die JVM mit Heap Dump on Out of Memory läuft, mit einem Pfad auf einem Volume, das den Neustart überlebt, denn Raten ohne Dump kostet Tage. Mit dem Dump schaue ich auf Retained statt Shallow Size, und der Dominator Tree nennt mir den Übeltäter meist in ein paar Minuten. Was ich tatsächlich finde, wiederholt sich: eine Map als Cache ohne Eviction, ein Thread Local, das auf einem gepoolten Thread gesetzt und nie geleert wurde und deshalb so lange lebt wie der Pool, oder eine Repository-Methode, die jede Zeile liefert, weil jemand die Pagination rausgeworfen hat. Ich schaue außerdem in die Garbage-Collection-Logs, um zu sehen, ob der Heap stetig gestiegen ist oder bei bestimmten Requests Spitzen hatte. Der Fix ist, etwas zu begrenzen, ein Cache mit Maximalgröße und Ablauf oder eine gestreamte Query, und dann beobachte ich das Live Set über eine Woche, um zu bestätigen, dass es flach ist.

Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.

So funktioniert es

Nachfragen, mit denen du rechnen solltest

  • Wie unterscheidest du ein Leak von einem Working Set, das einfach zu groß ist?
  • Was verursacht speziell einen Metaspace-Fehler?
  • Wie lecken Thread Locals auf einem gepoolten Thread?

Weitere Fragen für Java-Entwickler

Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.

Meine Fragen vorhersagen

Üb die harten Fragen, bevor sie gestellt werden

Trainier mit einem Live-Copiloten und geh dann vorbereitet rein. Ein $29 Session Pass bringt dich durch das Vorstellungsgespräch, ohne Abo und ohne Bindung.

GhostPilot holen