JAVA中变量存放的内存区域

新手上路,请多包涵

请问以下说法是否正确?为什么?

static基础变量的值存放在方法区中。
static引用变量的引用存放在方法区中,值存放在堆区中。

非static的基础成员变量的值存放在堆区中。
非static的引用成员变量的引用和值全部存放在堆区中。

方法中的基础变量的值存放在操作数栈中。
方法中的引用变量的引用存放在操作数栈中,值存放在堆区中。

阅读 3.4k
1 个回答

首先需要明确一点:java中的对象都是存储在堆中的,那么对象中的所有变量,也就存储在堆中。所以上述你说的各种变量的值,都是存储在堆中的。

但是,java程序在执行的过程中,会为每个方法创建一个帧栈,压入java虚拟机栈中,这个帧栈会存储局部变量表、操作数栈、动态链接、方法出口等一系列信息。你要关注的是这个局部变量表,它存储了某个对象的reference数据(也就是你说的引用),用来帮助java程序定位需要访问的对象。
对象的定位方式

总结起来就是:引用存在栈中,对象的实例存储在堆中。

至于对象的访问定位方式,目前主流的方式有使用句柄直接指针两种,具体细节可以参考《深入理解java虚拟机(第2版)》的2.3.3节(对象的访问定位)

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