@HotSpotIntrinsicCandidate标注静态方法引用运行后失效如何解决
问题结论
你遇到的NPE和@HotSpotIntrinsicCandidate注解、HotSpot方法内置化完全无关,该注解仅标记方法可被JVM替换为优化后的底层实现执行,不会破坏方法引用的实例对象,更不可能让已经通过Objects.requireNonNull校验的final字段变为null。
根本原因
你遇到的是OpenJDK 11的已知JIT编译bug,JIT在优化引用类型final字段的读取逻辑时,会错误地推断字段为null,提前抛出NPE,哪怕实际字段是非空的。你使用的11.0.12版本正好在该bug的影响范围内。
规避方案
- 最稳妥的方案是升级JDK版本:该bug在OpenJDK 11.0.13及后续的11小版本中已经修复,你可以直接升级到最新的Temurin 11版本即可解决。
- 如果暂时无法升级JDK,可以在
compare方法的indexFunction.apply调用前,手动增加显式非空校验:Objects.requireNonNull(indexFunction);,强制打断JIT的错误空值推断。 - 临时验证方案:可以先去掉
indexFunction字段的final修饰符,如果NPE不再出现,即可确认是该JIT bug导致的问题。
补充说明
你观察到传入的方法引用是Math::abs只是巧合,该bug的触发和方法引用指向的具体方法无关,只要对应代码路径触发了JIT的错误优化逻辑,任意方法引用都可能出现该异常。
内容的提问来源于stack exchange,提问作者Lukáš Petrovický
相关产品推荐
相关产品推荐

