Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java堆和堆栈内存分配_Java_Memory_Memory Management - Fatal编程技术网

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");
          }
    }