Java是否将函数本地的对象放在堆栈上?

问题描述

只是想知道,找不到答案(至少以我提出问题的方式):

如果我有这样的东西:

double compute(double input)
{
   return new Computer(input).run();
}

并假设Computer方法不会干扰任何其他类,那么编译器/ jvm会在堆栈上分配该类实例吗? (这里不是在谈论语言规范,而是隐藏的优化)

更一般地说,是否有一种方法可以通过遵循特定的约束来为局部函数分配零开销?

解决方法

(摘自OP中的评论)

如果JVM通过将成员存储在堆栈中可以确定不需要创建该对象,则它可以避免创建该对象-但是,如果这些成员本身是对对象的引用,则它是堆栈中的引用,对象仍在堆中。 (标量替换优化的一部分:https://shipilev.net/jvm/anatomy-quarks/18-scalar-replacement/

今年早些时候在堆栈分配方面有一些工作:https://github.com/microsoft/openjdk-proposals/blob/master/stack_allocation/Stack_Allocation_JEP.md……不知道这种情况是否还会继续。堆栈分配的问题之一是您不能无需进行大量修补即可替换线程堆栈(如果有指向堆栈分配的对象的指针)。