AuM
I'm new here

Massenhafte Generierung dynamischer Klassen im ContentCreator

Hallo Zusammen,

wir beobachten seit kurzem unter FS 5.1 eine regelmäßige Verlangsamung unseres Preview-Tomcats, welche sich durch einen Durchstart beheben lässt (mittlerweile fast jeden Tag). Zeitweise konnte ein PermGen OutOfMemoryError beobachtet werden.

Im Rahmen unserer Fehlersuche ist uns die hohe Menge an geladenen Klassen aufgefallen (Rd. 400.000), so dass wir uns mit Hilfe des "-verbose:class" Flags die Ausgaben des Classloaders angeschaut haben. Hierbei waren eine große Menge an (dynamisch generierten) Klassen nach folgendem Aufbau zu beobachten:

[Loaded BgnNavigationItem_getParentId_69325 from __JVM_DefineClass__]
[Loaded BgnNavigationItem_isVisible_69326 from __JVM_DefineClass__]
[Loaded BgnNavigationItem_isMenuItem_69327 from __JVM_DefineClass__]
[Loaded BgnNavigationItem_isSelected_69328 from __JVM_DefineClass__]
[Loaded BgnNavigationItem_isMenuItem_69329 from __JVM_DefineClass__]

Bei einer kurzen Log-Analyse kamen wir in einem last-armen Zeitraum auf rd. 25.000 solchen instantiierten Klassen pro Stunde (hochgerechnet).

Anhand des Klassennamens konnten wir diese Klassen einem unserer Library Module zuordnen. Hierbei scheint sich der dynamische Klassenname aus unserem Klassennamen sowie dem Methodennamen zusammenzusetzen (Klasse: BgnNavigationItem, Methode: getParentId).

Dieses Library-Modul nutzen wir, um unseren Redakteuren eine Erweiterte Navigation im ContentCreator anzubieten (Anzeige von loosen Seiten, Anzeige von versteckten Menüpunkten, etc.). Es wird also auf jeder Seite aufgerufen.

Der Aufruf schaut folgendermaßen aus:

$-- generate navigation --$
$CMS_SET(set_extendedNav,class("com.company.fsm.navigation.MyExtendedNavigation").new(#global.language,#global.node))$
$CMS_SET(set_extendedNavItems,set_extendedNav.getNavigation())$
$-- getNavigation() returns a flat list of navigation items containing information about the items type and visibility --$
$CMS_FOR(navItem,set_extendedNavItems)$
$-- check if navItem is a menue or a page and if the item is hidden in navigation to choose the appropriate menu icon --$
$CMS_IF(navItem.isMenuItem)$
...

Der Code selbst steckt in einer Library, die im Server-Scope installiert ist.

Da wir die eigene Klasse nicht anders nutzen als anderen Template-Code stellen wir uns die Frage, wie es zu dieser Menge an Klassen kommen kann und ob wir das Vermeiden können. Meines Erachtens nach sollten hier nur zwei Klassen geladen werden (Navigation und NavigationItem) und nicht dynamisch für jeden Methodenaufruf eine - mir fehlt dazu jedoch Wissen zur internen Funktion der FirstSpirit Template-Engine.

Kann man das Problem ggf. durch die Erzeugung der Objekte über ein Script umgehen oder sollte die Klasse in eine WebApp Komponente verschoben werden, die dem ContentCreator zugeordnet wird? Unser "worst-case scenario" wäre die Erstellung der Navigation komplett über Java-Code, aber das wollen wir zugunsten der Lesbarkeit und Wartbarkeit vermeiden.


Die FS-Version ist: 5.1.209

Vielen Dank und Gruß,

Martin Aulich

0 Kudos
1 Reply
Peter_Jodeleit
Crownpeak employee

Diese Klassen werden von FirstSpirit dynamisch erzeugt. Allerdings sollten die natürlich nicht immer wieder neu erzeugt werden, bzw. nur einmal pro Vorschau-Anwendung. Ich konnte das Verhalten auch nicht nachstellen. Übermittelt doch bitte euer Modul und ein reduziertes Test-Projekt unseren Helpdesk. Vielen Dank!

[EDIT]

Bitte auch die vollständige Ausgabe von "jmap -histo:live <pid-Tomcat>" beilegen.

Peter
0 Kudos