Verbesserung
Top-Thema
Detail
Wichtig
Detail
Wichtig
#26059
MemoryLeak weil der SecurityStorage ein ClusterManagerListener ist, der sich nicht deregistriert
Wenn der tl:PersistencyLayer neugestartet wird, bleibt die alte tl:KnowledgeBase im Speicher hängen. Referenzen-Kette:
- tl:DBKnowledgeBase
- tl:DBKnowledgeObject
- tl:AttributedStructuredElementWrapper
- tl:ElementBoundHelper
- tl:StorageAccessManager
- tl:ElementSecurityStorage
- Ist ein tl:ClusterManagerListener.
- tl:ClusterManager
- ClusterManager.Module.INSTANCE
Lösung
Der tl:SecurityStorage ist nicht mehr direkt ein tl:ClusterManagerListener. Statt dessen registriert er einen, der den tl:SecurityStorage nur per WeakReference hält.
Begründung: Der tl:SecurityStorage ist kein Service, sondern nur eine tl:ConfiguredInstance am tl:AccessManager. Es gibt daher keinen richtigen Zeitpunkt, zu dem er sich als Listener deregistrieren kann.
Verwandte Tickets
Aufgefallen im Rahmen von #26037, zusammen mit #26058.
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.