[Java]对象的实例存放在Java虚拟机栈(VM Stack)的什么位置?

比如一个类的成员变量:

Object obj = new Object();

obj是对象的实例,广义上讲是存放在「栈」上,指向「堆」上的内存地址;具体讲,我的印象里obj应该是存放在运行时数据区的虚拟机栈(VM Stack)上,
我知道虚拟机栈存储了栈帧:

一个完整的栈帧包含:局部变量表、操作数栈、动态连接信息、方法正常完成信息和方法异常完成信息。

其中局部变量表又存放了:

局部变量表存放编译期可知的各种基本数据类型、对象引用类型和returnAddress类型(指向一条字节码指令的地址:函数返回地址)。

问题是,栈帧随着方法的执行而入栈和出栈的,生命周期应该很短吧;那么上面说的obj作为对象的引用和类的成员变量,是存放在栈帧里的局部变量表里的吗?另外,一个函数的参数是存放在哪里的呢,也是局部变量表吗?

阅读 3k
1 个回答

Object obj = new Object();在内存创建了两份地址,一份是new Object()创建在堆上;一份是obj,这个就是对象引用,创建在栈上,指向 new Object()堆地址。如果Object obj = new Object()是在方法里执行的,方法结束后obj就出栈被销毁了,但是new Object()这个堆上的没有被销毁,要等gc回收。所有的对象引用和基本类型数据(比如int,byte,long,float,char等等)都是创建在栈上。函数参数跟函数内参数一样,把对象引用复制一份传给目标函数,目标函数执行完就销毁。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题