默认启用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)。通过-serverjavajavaw命令行上提供选项,可以显式选择服务器VM

以上是 默认启用AES-NI内部函数吗? 的全部内容, 来源链接: utcz.com/qa/424908.html

回到顶部