Maa*_*wes 31 java cpu cryptography aes jvm-hotspot
关于AES-NI,Oracle有关Java 8的说法:
添加了硬件内在函数以使用高级加密标准(AES).UseAES和UseAESIntrinsics标志可用于为Intel硬件启用基于硬件的AES内在函数.硬件必须是2010或更新的Westmere硬件.例如,要启用硬件AES,请使用以下标志:
Run Code Online (Sandbox Code Playgroud)-XX:+UseAES -XX:+UseAESIntrinsics要禁用硬件AES,请使用以下标志:
Run Code Online (Sandbox Code Playgroud)-XX:-UseAES -XX:-UseAESIntrinsics
但它并不表示默认情况下是否启用AES内在函数(对于支持它的处理器).所以问题很简单:如果处理器支持AES-NI,是否使用了AES内在函数?
奖金问题:有没有办法测试是否使用AES-NI?我想你可以根据性能来猜测,但这不是一种最佳或确定的测试方法.
对于不熟悉AES-NI内在函数的读者:它使用AES-NI指令集用预编译的机器代码替换字节代码.这是由JVM发生的,因此它不会出现在Java运行时或字节码的API中.
eck*_*kes 32
该标志的默认值为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)
Run Code Online (Sandbox Code Playgroud)
使用 AES-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)
Run Code Online (Sandbox Code Playgroud)
因此,它适用于最新Java 7的x64和i686(WOW64).该功能是通过https://bugs.openjdk.java.net/browse/JDK-7184394引入的,并且向后移植到7u40和7u45.
重要提示:AES-NI可能仅在服务器VM上可用.
在提交错误报告后,Oracle已对此予以承认.当他们创建引入它的Java 8的特征列表时,这个至关重要的信息就丢失了(后来它也被反向移植到7).服务器虚拟机可以通过提供明确choosen -serveron选项java或javaw命令行.