Java 7 上的效能緩慢

AEM 在 Java 7 上的執行速度突然降低,執行緒傾印並未顯示證據指出有問題的執行緒;許多執行緒處於「可執行」狀態且正在執行部分已知沒有任何錯誤的程式碼。

此問題的根本原因是 Java 7 受到 CodeCache 問題的影響,詳細情形請參閱 Stack Overflow 的問答集

簡單來說,「執行 Java 7 時,只要 CodeCache 已滿,JIT 便會停止,然後系統會排清將近三分之一的 CodeCache 區域,但卻不會重新啟用 JIT。」

此狀況導致那些從程式碼快取收回或未能由 JVM 執行的 Java 程式碼,在執行上變得相當緩慢。 因此,部分只需要 JIT 編譯碼的要求仍會在正常時間內回應,而其他要求則需要更長的時間。

解決方案:升級 Java 版本或停用排清程式碼快取

以下提供三種可能的解決方案:

  • 升級至 Java 8,該版本不會再受此效能問題影響。這是最安全的解決方案。
  • 升級至 Java 1.7.0_101-b14,該版本需要 Oracle 的 Java SE 支援,因為自 2015 年 5 月起 Java 7 的產品壽命已結束
  • 停止排清程式碼快取,並新增下列 JVM 引數至 AEM 起始腳本以增加快取容量。
    • -XX:-UseCodeCacheFlushing
    • -XX:ReservedCodeCacheSize=90M

這些引數會指定程式碼快取的容量為 90 MB ( 而非預設的 48 MB) 且停止排清程式碼快取,所以即使程式碼快取溢位,現存的熱碼也不會在直譯器模式下執行 (只有新的程式碼不會再進行編譯)。監控程式碼快取容量一段時間 (例如使用 jconsole) 以確保設定的最大值不會太低。請注意,升級至 Java 8 後,您必須移除這些設定。

 

此産品由 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License 授權  Creative Commons 條款未涵蓋 Twitter™ 與 Facebook 文章。

法律說明   |   線上隱私權政策