Java堆和堆栈内存分配
Java堆和堆栈内存分配,java,memory,memory-management,Java,Memory,Memory Management,per是一个局部变量,它将存储在堆或堆栈的何处 在堆上。每当您使用new创建对象时,它都会被分配到堆中。对象总是存储在堆中。但是,对per的引用将存储在局部变量数组中,该数组存储在为main(String[])创建的帧中,该帧存储在堆栈中 有关详细信息,请参阅: 编辑:我了解到JVM实际上能够通过执行。更好的是,可以应用称为标量替换的技术,其中省略了对象分配,并且对象的字段被视为局部变量。可以在机器寄存器上分配变量 自Java6U14以来,HotSpot虚拟机已经实现了通过堆栈分配进行转义分析。
per
是一个局部变量,它将存储在堆或堆栈的何处 在堆上。每当您使用new
创建对象时,它都会被分配到堆中。对象总是存储在堆中。但是,对per
的引用将存储在局部变量数组中,该数组存储在为main(String[])
创建的帧中,该帧存储在堆栈中
有关详细信息,请参阅:
编辑:我了解到JVM实际上能够通过执行。更好的是,可以应用称为标量替换的技术,其中省略了对象分配,并且对象的字段被视为局部变量。可以在机器寄存器上分配变量
自Java6U14以来,HotSpot虚拟机已经实现了通过堆栈分配进行转义分析。自Java 6u23以来,默认情况下已启用该功能。对于要在堆栈上分配的对象,它不能逃避执行线程,方法体或作为参数传递给另一个方法。您可以考虑更改您对这个问题的接受答案。“对每个引用”是误导性的。code>per是局部变量,包含对通过
newperson(“Andy”)
创建的对象的引用。局部变量的值将存储在堆栈帧中,堆栈帧是对对象的引用。您还可以说,堆栈帧中为局部变量per
保留了内存。引用对象所需的数量。但我想,这就是你真正想说的…@霍尔格:这就是我想说的,但我想这还不够清楚。谢谢你的澄清。
class Person{
private String name;
public Person(){
}
public Person(String name){
this.name=name;
}
public static void main(String[] arg)
{
Person per= new Person("Andy");
}
}