Oracleはこれについて、AES-NIに関してJava 8について述べています。
Advanced Encryption Standard(AES)を使用するためにハードウェア組み込みが追加されました。 UseAESおよびUseAESIntrinsicsフラグを使用して、ハードウェアベースのAES組み込み関数をIntelハードウェアで有効にできます。ハードウェアは2010年以降のWestmereハードウェアでなければなりません。たとえば、ハードウェアAESを有効にするには、次のフラグを使用します。
-XX:+UseAES -XX:+UseAESIntrinsics
ハードウェアAESを無効にするには、次のフラグを使用します。
-XX:-UseAES -XX:-UseAESIntrinsics
しかし、それはAES組み込みがデフォルトで有効になっているかどうかを示しません(それをサポートするプロセッサーの場合)。したがって、質問は簡単です。プロセッサがAES-NIをサポートする場合、AES組み込み関数が使用されますか?
おまけの質問:AES-NIが使用されているかどうかをテストする方法はありますか?パフォーマンスに基づいて推測できると思いますが、それはテストの最適な方法または確実な方法ではありません。
AES-NI組み込みに不慣れなリーダーの場合:AES-NI命令セットを使用して、バイトコードを事前にコンパイルされたマシンコードに置き換えます。これはJVMで発生するため、JavaランタイムまたはバイトコードのAPIには表示されません。
フラグのデフォルトはtrueで、検出が失敗した場合はfalseに設定されるため、+ PrintFlagsFinalを使用して、フラグが使用されているかどうかを確認できます。
私のラップトップなしAES-NI:
C:\>"C:\Program Files\Java\jdk1.7.0_51\bin\Java" -XX:+PrintFlagsFinal -version | find "UseAES"
bool UseAES = false {product}
bool UseAESIntrinsics = false {product}
Java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
デスクトップでも同じwithAES-NI:
C:\>"C:\Program Files\Java\jdk7\bin\Java" -XX:+PrintFlagsFinal -version | find "AES"
bool UseAES = true {product}
bool UseAESIntrinsics = true {product}
Java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
C:\>"C:\Program Files (x86)\Java\jre7\bin\Java" -XX:+PrintFlagsFinal -version | find "AES"
bool UseAES = true {product}
bool UseAESIntrinsics = true {product}
Java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode, sharing)
そのため、最近のJava 7では、x64とi686(WOW64)の両方で機能します。この機能は で導入されましたhttps://bugs.openjdk.Java.net/browse/JDK -7184394 および7u40および7u45にバックポートされます。
重要:AES-NIは、server VMでのみ使用できる場合があります。
これは、バグレポートが提出された後 オラクルによって承認されました 。この重要な情報は、導入されたJava 8の機能リストを作成したときに欠落していました(後で7にもバックポートされました)。サーバーVMは、Java
またはjavaw
コマンドラインで-server
オプションを指定することで明示的に選択できます。
コメントできません(愚かSOルールは50クレジットを超える必要があります!) openjdkからのこのメールスレッド は、すべてのAES組み込み関数がデフォルトで有効になっていることを示しています。 Oracleコアのどの程度かはわかりませんVMコードはopenjdkと共有します。スレッド全体を読んだ場合、32ビットVMの課題についても議論されます。これはおそらく2番目のテストの問題を説明しています実行します。