JVM 是否删除了不必要的 class 实例化?

Does the JVM remove unnecessary class instantiation?

假设我有一个 class

Box(double xi, double yi, double zi, double xf, double yf, double zf)

我有一个方法

Box#collides(Box other){
   if(other.xf < xi || other.xi > xf) return false;
   if(other.yf < yi || other.yi > yf) return false;  
   return other.zf >= zi && other.zi <= zf;
}

然后我得到两个盒子。我比较第一个

Box(a,b,c,d,e,f)

.collides()到另一个箱子,

Box(A,B,C,D,E,F)

还会创建 Box 对象吗?或者 JVM 会很聪明并使用类似于

的东西
static collides(double xi, double yi, double zi, double xf, double yf, double zf, double xi, double oyi, double ozi, double oxf, double oyf, double ozf){
   if(oxf < xi || oxi > xf) return false;
   if(oyf < yi || oyi > yf) return false;  
   return ozf >= zi && ozi <= zf;
}

这看起来像是一个微优化,但在我的例子中,可能有数百万个 Boxes 正在被实例化。

这可能发生也可能不发生。 HotSpot JVM 会这样做,但只有当所有内容都内联在一个方法中时(除了通过内联转换为过程间的优化外,没有过程内优化)。

它必须在单个过程中看到 while 分配、测试和 运行 超出范围(内联后)。这很可能会发生,但不能保证。然而,几百万个盒子意味着大约 60 兆字节的几倍,这是很多,但每秒分配几 MB 是很常见的。

如果您想确定,请提供类似 Box#collides(double xi, double yi, double zi, double xf, double yf, double zf) 的方法。