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:
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?
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?
Kommentare
Ansicht der Kommentare:
(Linear | Verschachtelt)
Ob es tut habe ich noch nicht getestet.
--
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)
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.
Layout by Ricky Wilson | Serendipity Template by Carl Galloway | Login
Impressum
Bernd Eckenfels
Mörscher Str. 8
76185 Karlsruhe
bernd-08(a)eckenfels.net
Read More
Suche
Kategorien
Verlinkung
Eingehende Links
Umfrage
Inhouse Coding?
Archive
Archive
Kommentare
Hans Dampf zu Bewerbung
2008-11-16 11:41
Ich finde es schon sehr anmaßend au
f derartige Anschreiben "negativ" z
u reagieren (und diese zu verspotte
n). Ansch [...]
2008-11-16 11:41
Bernd Eckenfels zu Bewerbung
2008-11-12 20:58
ROTFL - ja auf die Idee diese Blind
bewertungen abzusagen bin ich noch
garnicht gekommen .) Ist das jetzt
unhöflich [...]
2008-11-12 20:58
Dana Stoll zu Bewerbung
2008-11-12 13:39
Anbei ein Antwortschreiben, ebenfal
ls um einige Gedanken ergänzt.
S
ehr geehrter Herr Bewerber,
viel
en Dank f [...]
2008-11-12 13:39
Balu zu Gmail Features
2008-11-11 09:33
Schade, ich mag das Interface von G
Mail, aber ich brauche diese Filter
, um Catchall-Konten zu sortieren..
.
Ich [...]
2008-11-11 09:33
Bernd Eckenfels zu Gmail Features
2008-11-11 02:37
Ich glaube nen, nur From/To/Subject
, body und hasAttachment.
2008-11-11 02:37
Balu zu Gmail Features
2008-11-11 01:12
Kann man inzwischen nach beliebigen
Header-Feldern filtern?
Also z.
B. nach X-Original-To: oder sowas?
2008-11-11 01:12
TK zu Gmail Features
2008-11-09 18:34
LoL hätte nicht gedacht das die den
schwachsinn wirklich einführen. Au
ßerdem könnte ein Betrunkener das F
eature au [...]
2008-11-09 18:34
Bernd Eckenfels zu Gmail Features
2008-11-07 03:00
Ja ich benutz das eigentlich nur in
Englisch. Die Features waren mir n
ur bisher nicht aufgefallen .)
2008-11-07 03:00
Rico zu Gmail Features
2008-11-05 16:58
Tip: GMail auf Englisch umstellen,
dann hast du die neuen Features sch
on Monate vorher.
2008-11-05 16:58
Hardware-Blogger zu Firmenstrukturen
2008-11-03 21:44
Sehr lustig das Bild aber leider wi
rklichkeit in vielen Unternehmen...
2008-11-03 21:44
Blog abonnieren
Blogsphere
Letzten Monat...
Fr, 17.10.2008Java 6u10 ist da (und 6u7 für Itanium)
Fr, 17.10.2008Java 6u10 ist da (und 6u7 für Itanium)
Do, 16.10.2008Gillmor und der Open Source Markt
Mo, 13.10.2008Microsoft Entwicklungen
Mi, 08.10.2008Hyper-V Server
Fr, 17.10.2008Java 6u10 ist da (und 6u7 für Itanium)
Do, 16.10.2008Gillmor und der Open Source Markt
Mo, 13.10.2008Microsoft Entwicklungen
Mi, 08.10.2008Hyper-V Server
Top Referers
www.google.de (24)
search.live.com (4)
bernd.eckenfels.net (2)
ralfeisend.blog.de (2)
www.google.ch (2)
blog.micha.de (1)
de.ask.com (1)
www.google.at (1)
search.live.com (4)
bernd.eckenfels.net (2)
ralfeisend.blog.de (2)
www.google.ch (2)
blog.micha.de (1)
de.ask.com (1)
www.google.at (1)

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
Aufgenommen: Aug 06, 23:35