Open JDKのARMの処理性能が低かった話
Open JDKのARM版を使用したら、intel版に比べて処理速度が遅いという事象が発生したので、
そのときの調査内容、および参考にしたサイトについて記載。
※ただし、処理性能が低い根本的な原因の究明にまでは至っていない
JDK(Java Development Environment)とは
Java用の開発パッケージ。
JRE(Java Runtime Environment : Java用のプログラムを実行する環境)に加え、
Java用のコンパイルなどの開発用のソフトウェアが入っている。
JREには、
JVM(Java Virtual Machine : Javaのプログラムを動作させる仮想環境)や
Java用のAPI(Application interface)が入っている。
Oracle JDK
Oracle社が開発したJDK。
商用での利用は有料。
A. COMMERCIAL FEATURES.の欄にそれらしきことが記載されている↓
http://www.oracle.com/technetwork/java/javase/terms/license/index.html
Open JDK
Oracle以外の企業も開発に参加しているオープンソース版のJDK。
JDK7以降は、Open JDKもOracle JDKも基本的には同じで、
普通にプログラミングする程度なら特に変わりはない。
Open JDKはCPUがARMだと処理性能が低い?
下記のサイトによると、Open JDKはARM向けに最適化されていないので、
Oracle JDKに比べて、処理性能が低いとの記載がある。
※ Oracleのサイトなので、Oracle贔屓になっているのかもしれないが
動作比較
実際に実機でARM環境で、Open JDKとOracle JDKでJavaのプログラムを実行したところ、下記の結果が得られた。
- Open JDK版は、処理速度が非常に遅い
- Open JDK版は、CPU使用率が非常に高い。
コードキャッシュの削除による処理速度低下の可能性
Javaのコードキャッシュ(コンパイルされたコードを一時的に保存する領域)、のサイズがデフォルト設定だと小さいため、上限を超えた際にJavaの機能により、コードキャッシュが削除されてしまい、
その都度コンパイルをするため、処理が遅くなるという事象があるようだ。
コンパイル自体が実行されていない?
jstatコマンドでコンパイル状態を確認したところ、
Open JDKだと全くコンパイルが行われていない状態だった。
* JITコンパイルされたタスクの累積を表示
jstat -compiler ${JAVA_PID} 表示間隔(ミリ秒)
* JITコンパイルされたメソッドを表示
jstat --printcompilation ${JAVA_PID} 表示間隔(ミリ秒)
https://docs.oracle.com/javase/jp/6/technotes/tools/share/jstat.html
下記のサイトでは、下記の用にJavaの起動オプションでコードキャッシュを削除する機能を無効にしたところ、処理遅延が改善したと記載されている。
当方の環境では、上記対応をしてもコンパイルがされない状態が続いた。
* Javaのオプションの初期値を表示し、コードキャッシュが有効になっていた場合、オプションを指定してコードキャッシュの削除を無効に
java -XX:+PrintFlagsFinal -version
* コードキャッシュの削除を無効
-XX:-UseCodeCacheFlushing
理由は分からないが、Javaのオプションの中には特定のCPU専用のオプションがあるが、
そのオプションが影響して、ARM版ではそもそもコンパイルがされない状態になっている可能性がある?