@HotSpotIntrinsicCandidate 和双/浮动拳击

问题描述

因此,我正在编写一些代码,这些代码会在最内层循环中对原始类型进行装箱。我查看了 Integer.valueOf 以检查缓存了哪些 int 范围 - 顺便说一下:为什么认情况下只有 Byte 范围? - 首先注意到 - 令我满意的是 - 范围可以通过 JVM 属性进行配置,然后,这是一个内在方法。这看起来有点奇怪,因为该方法非常简单,我希望 Hotspot 编译和内联代码已经是最佳的,但是还可以。然后我转向浮点值,它们仍然是内在的,尽管方法字面上只是调用类的构造函数,因为没有明显的缓存策略。

在装箱浮点原语时,Hotspot 可以做哪些优化(例如一些 jvm 实现)?

解决方法

Double.valueOfFloat.valueOf 以及其他类似的 valueOf 是 HotSpot JVM 中的内在方法。 JVM 确实knows 关注这些方法并特别对待它们。

EliminateAutoBox优化,默认开启。优化的想法是摆脱多余的装箱/拆箱。 JIT 编译器会查找匹配的 Double.valueOf()/doubleValue() 对,并在可能的情况下同时消除这两个调用。