问题描述
只是想知道,找不到答案(至少以我提出问题的方式):
如果我有这样的东西:
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……不知道这种情况是否还会继续。堆栈分配的问题之一是您不能无需进行大量修补即可替换线程堆栈(如果有指向堆栈分配的对象的指针)。