默认启用AES-NI内部函数吗?
Oracle关于AES-NI关于Java 8的说法如下:
添加了硬件内在函数以使用高级加密标准(AES)。UseAES和UseAESIntrinsics标志可用于为Intel硬件启用基于硬件的AES内在函数。硬件必须是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)
与 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)
因此,它适用于使用最新Java
7的x64和i686(WOW64)。该功能是通过https://bugs.openjdk.java.net/browse/JDK-7184394引入的,并反向移植到7u40和7u45。
重要:AES-NI可能仅在 上可用。
在提交错误报告后,Oracle承认了这一点。当他们在Java
8的特性列表中创建了该重要信息时,这些信息就丢失了(后来也移植到了7)。通过-server
在java
或javaw
命令行上提供选项,可以显式选择服务器VM
。
以上是 默认启用AES-NI内部函数吗? 的全部内容, 来源链接: utcz.com/qa/424908.html