上次更新時間
2021年4月29日
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 後,您必須移除這些設定。