java 是否将函数的局部对象放在堆栈上?
Does java put objects local to a function on the stack?
只是想知道,找不到答案(至少以我提出问题的方式):
如果我有这样的东西:
double compute(double input)
{
return new Computer(input).run();
}
并且假设 Computer
class 方法不干扰任何其他 classes,compiler/jvm 是否会分配 class 实例堆栈? (这里不是说语言规范而是隐藏的优化)
更一般地说,是否有一种方法可以通过遵循特定约束来为函数局部对象进行零开销分配?
(取自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 ......不知道那是否还在进行。堆栈分配的问题之一是你不能,例如在不进行大量修补的情况下替换线程堆栈(如果有指向堆栈分配对象的指针)。
只是想知道,找不到答案(至少以我提出问题的方式):
如果我有这样的东西:
double compute(double input)
{
return new Computer(input).run();
}
并且假设 Computer
class 方法不干扰任何其他 classes,compiler/jvm 是否会分配 class 实例堆栈? (这里不是说语言规范而是隐藏的优化)
更一般地说,是否有一种方法可以通过遵循特定约束来为函数局部对象进行零开销分配?
(取自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 ......不知道那是否还在进行。堆栈分配的问题之一是你不能,例如在不进行大量修补的情况下替换线程堆栈(如果有指向堆栈分配对象的指针)。