Java注解之@IntrinsicCandidate

Since: JDK 16
@IntrinsicCandidate是一个Java注解,用于标记一个方法或构造函数是一个内在的候选方法,即该方法或构造函数是由编译器自动生成的,而不是由开发人员手动编写的。这个注解的作用是告诉编译器,该方法或构造函数是一个内在的候选方法,可以被优化和替换为更高效的代码。在Java 9中,@IntrinsicCandidate注解被引入到了JVM规范中,以支持更好的JIT编译器优化。 
具体来说,当JVM检测到使用了@IntrinsicCandidate注解的方法时,它会尝试将该方法替换为更高效的内置方法,以提高程序的性能。

例如,JVM可以将使用@IntrinsicCandidate注解的方法替换为JVM内置的方法,如System.arraycopy(),以提高数组复制的效率。另外,JVM还可以将使用@IntrinsicCandidate注解的方法替换为特定平台的本地方法,以进一步提高性能。

需要注意的是,@IntrinsicCandidate注解并不保证方法一定会被优化或替换,这取决于JVM的实现和优化策略。同时,使用@IntrinsicCandidate注解的方法也需要满足一定的条件,例如方法的参数和返回值类型必须是基本类型或数组类型。

总之,@IntrinsicCandidate注解可以帮助开发者优化程序的性能,但需要注意其使用条件和实际效果。 

@IntrinsicCandidate注释是特定于HotSpot虚拟机的。它表明带注释的方法可能(但不保证)被HotSpot VM强化。如果HotSpot VM用手工编写的汇编和/或手工编写的编译器IR(编译器固有的)替换带注释的方法,以提高性能,则方法被强化。@IntrinsicCandidate注释是Java库的内部,因此不应该与应用程序代码有任何关联。Java库的维护者在修改带有@IntrinsicCandidate注释的方法时必须考虑以下几点。

当修改带有@IntrinsicCandidate注释的方法时,HotSpot VM实现中相应的内在代码必须更新以匹配带注释的方法的语义。

对于一些带注释的方法,相应的内部可能会忽略一些低级检查,如果使用Java字节码实现内部检查,这些检查理所当然会被执行。这是因为单个Java字节码隐式地检查异常,如NullPointerException和ArrayStoreException。如果这样的方法被汇编语言中的固有代码所取代,那么作为正常字节码操作执行的任何检查都必须在进入汇编代码之前执行。这些检查必须在适当的情况下对内部函数的所有参数以及内部函数通过这些参数获得的其他值(如果有的话)执行。检查可以通过检查方法的非固有Java代码来推导,并准确地确定代码可能抛出哪些异常,包括未声明的隐式runtimeexception。因此,根据内部执行的数据访问,检查可能包括:

对引用进行空检查

对用作数组索引的原语值进行范围检查

对原始值的其他有效性检查(例如,除零条件)

存储对存储在数组中的引用值的检查

对从内部索引的数组进行数组长度检查

引用强制转换(当形式参数是Object或其他弱类型时)

注意,接收方值(this)作为一个额外的参数传递给所有非静态方法。如果非静态方法是一个内部方法,则接收者的值不需要null检查,但是(如上所述)内部方法从对象字段加载的任何值也必须进行检查。为了清晰起见,最好将内在性设置为静态方法,以明确对它的依赖关系。此外,最好在输入内部代码之前显式地从对象字段加载所有必需的值,并将这些值作为显式参数传递。首先,这对于空检查(或其他检查)可能是必要的。其次,如果内部程序重新加载字段中的值,并在没有检查的情况下对这些值进行操作,竞争条件可能会将未检查的无效值引入内部程序。如果内部需要将值存储回对象字段,则应该显式地从内部返回该值;如果有多个返回值,编码器应该考虑在数组中缓冲它们。从intrinsic中删除字段访问不仅澄清了JVM和JDK之间的接口;它还有助于解耦HotSpot和JDK实现,因为如果在intrinsic之前和之后的JDK代码管理所有字段访问,那么可以将intrinsic编码为不知道对象布局。

HotSpot VM的维护人员在修改intrinsic时需要考虑以下几点。

当添加一个新的内在时,确保Java库中相应的方法用@IntrinsicCandidate进行了注释,并且所有可能导致调用内在的调用序列都包含了被内在忽略的检查(如果有的话)。

当修改现有的内部时,必须更新Java库以匹配内部的语义,并执行内部省略的所有检查(如果有的话)。

不直接参与维护Java库或HotSpot VM的人员可以安全地忽略用@IntrinsicCandidate注释方法的事实。HotSpot VM(在内部)定义了一个内部函数列表。HotSpot VM支持的所有平台上并不是所有的intrinsic都可用。此外,给定平台上固有特性的可用性取决于热点VM的配置(例如,启用的VM标志集)。因此,用@IntrinsicCandidate注释一个方法并不能保证被标记的方法被HotSpot VM所强化。如果CheckIntrinsics VM标志被启用,HotSpot VM检查(当加载一个类时):(1)该类的所有方法也在VM的intrinsic列表上,并且(2)该类的所有方法都带有@IntrinsicCandidate注释,在列表中有一个intrinsic。

你可能感兴趣的:(JVM,Java,java,jvm,开发语言)