问题描述
因此,我正在编写一些代码,这些代码会在最内层循环中对原始类型进行装箱。我查看了 Integer.valueOf
以检查缓存了哪些 int
范围 - 顺便说一下:为什么默认情况下只有 Byte
范围? - 首先注意到 - 令我满意的是 - 范围可以通过 JVM 属性进行配置,然后,这是一个内在方法。这看起来有点奇怪,因为该方法非常简单,我希望 Hotspot 编译和内联代码已经是最佳的,但是还可以。然后我转向浮点值,它们仍然是内在的,尽管方法字面上只是调用类的构造函数,因为没有明显的缓存策略。
在装箱浮点原语时,Hotspot 可以做哪些优化(例如一些 jvm 实现)?
解决方法
Double.valueOf
、Float.valueOf
以及其他类似的 valueOf
是 HotSpot JVM 中的内在方法。 JVM 确实knows 关注这些方法并特别对待它们。
有EliminateAutoBox优化,默认开启。优化的想法是摆脱多余的装箱/拆箱。 JIT 编译器会查找匹配的 Double.valueOf()
/doubleValue()
对,并在可能的情况下同时消除这两个调用。