Verbesserung
Top-Thema
Detail
Wichtig
Detail
Detail
#26090
Memory Leak weil das TLObject "IMAPMailFolder" Listener am IMAPFolder ist
tl:IMAPMailFolder ist ein tl:TLObject. Gleichzeitig ist es ein Listener an `IMAPFolder `. Diese werden indirekt vom tl:MailServerProxy gespeichert. Von dort aus gibt es drei Referenz-Ketten zu einem GC-Root. Nicht alle lassen sich aufbrechen. Dadurch werden letztlich tl:IMAPMailFolder dauerhaft im Speicher gehalten, und mit ihnen ihre tl:KnowledgeBase und alles was dazu gehört.
Lösung
tl:IMAPMailFolder ist nicht mehr direkt Listener. Statt dessen gibt es einen Listener, der tl:IMAPMailFolder per WeakReference hält. Der Listener entfernt sich selber, wenn die Referenz auf tl:IMAPMailFolder null ist.
Test
Die geskripteten Tests im Demo durchlaufen lassen. Kurz bevor die letzten Tests ausgeführt werden einen Dump] erstellen. Diesen zum Beispiel mit [JavaResources#Profiler:JVisualVM|JVisualVM] öffnen. Das Histogramm der Klassen öffnen, nach der Klasse tl:DBKnowledgeBase filtern und auf die Anzahl der Instanzen achten. Es darf nur eine geben.