Geringe Leistung auf Java 7
Die Leistung von AEM auf Java 7 nimmt plötzlich ab und Thread-Sicherungskopien erhalten keinen Hinweis auf eine Thread-Ursache. Viele Threads befinden sich im Zustand RUNNABLE und führen Teile des Codes aus, die bekanntermaßen keine Fehler enthalten.
Die zugrunde liegende Ursache dieses Problems ist, dass in Java 7 das CodeCache-Problem auftritt, das in Stapelüberlauf – Fragen und Antworten beschrieben ist.
Zusammengefasst wird in Java 7, sobald der CodeCache voll ist, das JIT angehalten, dann beinahe ein Drittel des CodeCache-Bereichs geleert, das JIT dann aber nicht wieder aktiviert.
Ergebnis dieses Szenarios ist die deutlich langsamere Ausführung des Java-Codes, der entweder aus dem Code-Cache entfernt oder nie von JVM ausgeführt wurde. Aus diesem Grund erfolgt die Antwort einiger Anforderungen, die nur auf JIT-kompilierten Code treffen, weiterhin mit den üblichen Antwortzeiten, während andere Anforderungen wesentlich länger dauern.
Lösung: Java-Version aktualisieren oder Leeren des Code-Caches deaktivieren
Es gibt drei mögliche Lösungen:
- Upgrade auf Java 8, das nicht von diesem Leistungsproblem betroffen ist. Dies ist die sicherste Lösung.
- Upgrade auf Java 1.7.0_101-b14, für das Java SE-Unterstützung von Oracle erforderlich ist, da Java 7 seit Mai 2015 ausgelaufen ist.
- Deaktivieren Sie das Leeren des Code-Caches und erhöhen Sie die Cachegröße, indem Sie die folgenden JVM-Argumente zum AEM-Anfangsskript hinzufügen:
- -XX:-UseCodeCacheFlushing
- -XX:ReservedCodeCacheSize=90M
Diese Argumente legen eine Code-Cache-Größe von 90 MB (anstelle der standardmäßigen 48 MB) fest und deaktivieren das Leeren des Code-Caches, sodass bei einem Überlauf des Code-Caches vorhandener Hot Code nicht im Interpreter-Modus ausgeführt wird (nur neuer Code wird nicht mehr kompiliert). Überwachen Sie die Code-Cache-Größe einige Zeit lang (z. B. mithilfe von jconsole), um sicherzustellen, dass der konfigurierte Maximalwert nicht zu niedrig ist. Beachten Sie, dass Sie diese Einstellungen nach einem Upgrade auf Java 8 entfernen müssen.
.