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.

 

Dieses Werk unterliegt den Bedingungen der Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.  Twitter™- und Facebook-Beiträge fallen nicht unter die Bedingungen der Creative Commons-Lizenz.

Rechtliche Hinweise   |   Online-Datenschutzrichtlinie