【问题标题】:Does the JVM remove unnecessary class instantiation? [duplicate]JVM 是否删除了不必要的类实例化? [复制]
【发布时间】:2019-11-24 18:32:55
【问题描述】:

假设我有一堂课

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 正在被实例化。

【问题讨论】:

  • 你问是否有两个盒子对象会消失并创建一个新方法?
  • 我在问 JVM 是否不必创建盒子对象,而是使用类似于我提供的静态方法的东西。

标签: java optimization jvm


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多