JVM是否删除不必要的类实例?

时间:2019-11-24 18:32:55

标签: java optimization jvm

假设我有课

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;
}

这似乎是微优化,但就我而言,可能实例化了数百万个Box

1 个答案:

答案 0 :(得分:1)

它可能会或可能不会发生。 HotSpot JVM可以这样做,但是仅当所有内容都通过一种方法内联时(除了通过内联转换为过程间的优化之外,没有过程内优化)。

它必须在一个过程中(内联之后)查看while分配,测试和运行范围外。这很可能会发生,但不能保证。但是,几百万个盒子意味着大约60兆字节的数量,这是很多倍,但是每秒分配几MB的情况却很常见。

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