Skip to content

Achtung Java: Memory Leaks durch Thread Objekte (Quizz)

Ich habe letzte Woche einige Zeit mit dem Eclipse Profiler verbracht, um ein merkwürdiges Memory Leak in unserer Software zu finden. Eigentlich ist das ja nicht mein Job, aber da mich der Bug von einer Kunden Demo abgehalten hat, und da ich es hasse wenn ich die Ursachen von solchen Problemen nicht kenne, habe ich ein paar Stunden meiner Freizeit im Debugger verbracht. Problem war, dass eine unserer Komponenten sowohl synchron, als auch asynchron (mittels eigenem Thread Pool) aufgerufen werden kann. Beim synchronen Aufruf der Funktion lief aber reproduzierbar und schnell der Speicher zu. Meine Vermutung war ja erst, dass der Thread Handler am Ende der run methode noch irgendwelche cleanup tasks übernimmt, die der selten benutzte synchrone Code vergisst. Aber die Ursache ist an einer anderen Stelle, tief in der Java API zu suchen:
public class Processor extends Thread {
public Processor() {
}

public void run() {
// do something important
}
}

public class Starter {
public void start(boolean async) {
Processor p = new Processor();
if (async) {
p.start();
} else {
p.run();
}
}
}
Na wer findet das Memory Leak bei Starter.start(false)? Auflösung im nächsten Blog Eintrag. BTW: hat jemand eine Ahnung wie ich einfach Java Quelltext in S9Y pasten kann (am besten mit Syntax Coloring). Oder wie ich NL2BR partiell deaktivieren kann?

Trackbacks

IT Blog am : Achtung Java: Memory Leaks durch Thread Objekte (Lösung)

Nach meiner Quizzfrage gab es einige Diskussionen über das Problem. Meine Analyse fand ein Problem im Konstruktur der Klasse Thread. Wannimmer ein Thread Objekt erzeugt wird, registriert es sich an der zugehörigen (aktuellen) ThreadGroup. Das hat den Effe

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

el*Loco am :

Für Code inkl. Highlighting gibt es ein Plugin: http://cvs.sourceforge.net/viewcvs.py/php-blog/additional_plugins/serendipity_event_geshi/ Ob es tut habe ich noch nicht getestet.

Cosmotic am :

Funktioniert sehr gut. Man kann GeSHi übrigens auch direkt durch Spartacus installieren lassen.

Bernd Eckenfels am :

Dann werde ich wohl am besten mal meine S9Y Installation updaten. Ich würd gern mein CSS customizing behalten, auf der anderen Seite denke ich, dass umstellen auf Template basierende Seiten auch notwendig ist - mal sehen ob das beides zusammen ohne viel Aufwand machbar ist, ich zieh mal nen Clone hoch und lass auf dem den Update durchlaufen.

Rico am :

Ich zitiere mal Gilles: -- Object of a class extended from Thread class remains in memory if only the object has been created but the thread has not been started (with .start()). The gabage collector doesn't remove this object. You can resolve this problem if you start and stop immediatly the thread after the creation of object. It's possible you need to modify your code in the run() methode for this case. -- Andere Lösung: Nicht von Thread erben, sondern Runnable implementieren (was ja eh immer die bevorzugte Lösung sein sollte - verbaut man sich nicht die Vererbungshierarchie)

Bernd Eckenfels am :

Ja genau, zu dem Thema gibts auch eine Diskussion in de.comp.lang.java, bei der sich herausgestellt hat, dass diese unerwartete Verhalten des Thread Konstruktors in Java 1.5 und 1.6 (zumindest bei SUN) geändert wurde. Den weg mit Runable habe ich dann auch vorgeschlagen. Der hat in der Tat noch weitere Vorteile. Unter anderem auch eine flexiblerer Art und Weise wie der Job gestartet werden kann.

Rico am :

Gilles Vilhès - ein Kollege, ob er Bücher veröffentlicht hat weiß ich nicht :-D

Kommentar schreiben

BBCode-Formatierung erlaubt
Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Um einen Kommentar hinterlassen zu können, erhalten Sie nach dem Kommentieren eine E-Mail mit Aktivierungslink an ihre angegebene Adresse.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss, um dieses Verfahren anzuwenden.
CAPTCHA