关于AES-NI,Oracle对Java 8有这样的看法:
硬件本质被添加到使用高级加密标准(AES)。UseAES和UseAESIntrinsics标志可用于为Intel硬件启用基于硬件的AES本质。硬件必须是2010年或更新的韦斯特米尔硬件。例如,若要启用硬件AES,请使用以下标志: -XX:+UseAES -XX:+UseAESIntrinsics 若要禁用硬件AES,请使用下列标志: -XX:-UseAES -XX:-UseAESIntrinsics
但它并不表示在默认情况下(对于支持AES的处理器)是否启用了AES本质。所以问题很简单:如果处理器支持AES-NI,那么AES的本质是否被使用?
附加问题:是否有任何方法来测试AES-NI是否被使用?我想您可以根据性能进行猜测,但这并不是一种最佳或肯定的测试方法。
对于不熟悉AES-NI本质的readerS :它使用AES-NI指令集,用预编译的机器代码替换字节代码。这是由JVM实现的,因此它不会出现在Java运行时或字节码的API中。
发布于 2014-05-07 15:58:38
该标志的默认值为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)因此,它既适用于x64和i686 (WOW64),也适用于最近的Java7。该特性是在https://bugs.openjdk.java.net/browse/JDK-7184394中引入的,并支持7u 40和7u 45。
重要事项: AES-NI可能只在服务器VM上可用.
甲骨文在一份错误报告被归档之后承认了这一点。当他们创建Java 8的特性列表时,缺少了这段重要的信息(后来,它也被移植到了7中)。通过在-server或javaw命令行上提供java选项,可以显式地选择服务器VM。
发布于 2014-04-30 11:49:37
这个来自openjdk的邮件线程说,在默认情况下,所有AES本质都是启用的。虽然我不确定Oracle核心VM代码有多少与openjdk共享。如果您阅读了整个线程,他们也会讨论32位VM上的挑战,这可能解释了您在第二次测试运行时遇到的问题。
https://stackoverflow.com/questions/23058309
复制相似问题