Verbesserung
Top-Thema
Detail
Wichtig
Detail
Es gibt einen Memory Leak, durch den alte tl:KnowledgeBase tl:UpdateChainLink Objekte im Speicher gehalten werden. An denen hängen wiederum alte tl:KBCache Objekte, durch die das aufgefallen ist.
Kette der Referenzen:
- tl:SimpleKBCacheValue
- tl:UpdateChainLink
- tl:TLContext
- tl:MainLayout
- tl:AdminElementComponent
- tl:AttributeFormContext
- tl:AttributeUpdateContainer
- tl:ObjectEditing (tl:FormObjectOverlay representing a tl:TLObject being currently edited)
- tl:EvalContext (der aus com.top_logic.model.search)
- tl:QueryExecutor
- tl:OptionsByExpression
- tl:GeneratorFactory (Modul, wird durch GeneratorFactory.Module.INSTANCE im Speicher gehalten)
Lösung
Der tl:QueryExecutor speichert den tl:EvalContext nicht mehr. Statt dessen wird der nur noch für die Dauer der Ausführung erstellt. Zusätzlich wurde in dem Rahmen dafür gesorgt, dass der tl:QueryExecutor die tl:KnowledgeBase und das tl:TLModel kennt, für die der Ausdruck kompiliert wurde. Der tl:QueryExecutor übergibt beides an den tl:EvalContext, wenn er ihn erstellt. Der tl:EvalContext wird nur noch vom tl:QueryExecutor erstellt, die entsprechenden Methoden wurden privat. Dadurch soll es unwahrscheinlicher werden, dass der Ausdruck sich auf eine andere tl:KnowledgeBase oder ein anderes tl:TLModel bezieht, als dem tl:EvalContext übergeben wurde.
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 und nach den Klasse tl:MainLayout und tl:UpdateChainLink filtern und auf die Anzahl der Instanzen achten. Es darf nur ein tl:MainLayout geben und nur eine paar tl:UpdateChainLink Objekte.