比如一个类的成员变量:
Object obj = new Object();
obj是对象的实例,广义上讲是存放在「栈」上,指向「堆」上的内存地址;具体讲,我的印象里obj应该是存放在运行时数据区的虚拟机栈(VM Stack)上,
我知道虚拟机栈存储了栈帧:
一个完整的栈帧包含:局部变量表、操作数栈、动态连接信息、方法正常完成信息和方法异常完成信息。
其中局部变量表又存放了:
局部变量表存放编译期可知的各种基本数据类型、对象引用类型和returnAddress类型(指向一条字节码指令的地址:函数返回地址)。
问题是,栈帧随着方法的执行而入栈和出栈的,生命周期应该很短吧;那么上面说的obj作为对象的引用和类的成员变量,是存放在栈帧里的局部变量表里的吗?另外,一个函数的参数是存放在哪里的呢,也是局部变量表吗?
Object obj = new Object();在内存创建了两份地址,一份是new Object()创建在堆上;一份是obj,这个就是对象引用,创建在栈上,指向 new Object()堆地址。如果Object obj = new Object()是在方法里执行的,方法结束后obj就出栈被销毁了,但是new Object()这个堆上的没有被销毁,要等gc回收。所有的对象引用和基本类型数据(比如int,byte,long,float,char等等)都是创建在栈上。函数参数跟函数内参数一样,把对象引用复制一份传给目标函数,目标函数执行完就销毁。