Java 7でパフォーマンスが遅い場合
Java 7でAEMのパフォーマンスが急に遅くなっていても、スレッドダンプに問題を引き起こしているスレッドが見当たらない場合、多くのスレッドがRUNNABLEの状態にあり、既知のコードの実行部分には不備がありません。
この問題の根本的な原因は、本「スタックオーバーフローに関する質問と回答」に記載されているCodeCacheの問題がJava 7に生じていることです。
つまり、「Java 7では、CodeCacheの容量が一杯になると、JITが停止し、CodeCacheエリアのほぼ3分の1がフラッシュ(破棄)されますが、JITは再度有効にはなりません」。
このシナリオは、CodeCacheから追い出された(エビクション)JavaコードもしくはJava仮想マシン(JVM)によって一度も実行されなかったJavaコードのいずれかの実行をさらに遅くすることにつながります。このため、JITがコンパイルしたコードにのみ到着した一部のリクエストは、通常の応答時間で応答しますが、他のリクエストは応答にかなり長い時間がかかります。
解決策:Javaのバージョンをアップグレードするか、CodeCacheのフラッシュを無効にします
解決策は3つ考えられます。
- このパフォーマンスの問題の影響を受けないJava 8にアップグレードします。これは一番安全な解決策です。
- 2015年5月をもってJava 7は製造(販売/サポート)終了となるため、OracleからのJava SE Supportを必要とするJava 1.7.0_101-b14にアップグレードします。
- CodeCacheのフラッシュを無効にし、以下のJava仮想マシン(JVM)引数をAEMの開始スクリプトに追加して、キャッシュ容量を増やします:
- -XX:-UseCodeCacheFlushing
- -XX:ReservedCodeCacheSize=90M
これらの引数は、(デフォルトの48MBの代わりに)90MBのCodeCache容量を指定するため、CodeCacheの容量が一杯になった場合、インタープリターモードで既存のホットコードは実行しません(新しいコードのみがコンパイルされなくなります)。設定した最大値が低すぎないかを確認するため、CodeCache容量を時々確認してください(例:jconsoleを使用)。Java 8にアップグレードした後、これらの設定を削除する必要がありますのでご注意ください。