java 实例变量存放在堆区还是栈区?

BBQBarbeque 2016-12-10 10:07:42
我知道局部变量是存放在栈区的,但是实例变量(包括primitive主数据类型)存放在哪呢,栈区?还是堆区?,那引用变量呢?求大神指教一下!!
...全文
3776 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 sinat_31168349 的回复:
对象都放在堆上,栈保存基本类型的值、对象的引用(可以理解为对象在堆上的地址)。
这个理解应该是有问题的,对象并不一定是都是在堆上的,JDK8默认是开启逃逸分析的,很多对象在一些方法中会现在栈上分配,栈上放不下才会放在堆上。具体可以看看JVM逃逸分析以及JVM相关的资料
大汗人 2021-01-02
  • 打赏
  • 举报
回复
类映射在方法区 new的所有都是堆内存 基本类型八大类int btye short long char boolean float double 都是在栈内存之中 方法执行在栈内存 常量和静态元素在方法区
万事皆成 2020-12-30
  • 打赏
  • 举报
回复
实例变量是放在堆上,具体参考《 Head First Java》构造器与垃圾收集器章节,关于堆栈问题里面讲的很明白 截图如下
daochuwenziyao 2017-05-18
  • 打赏
  • 举报
回复 2
程序执行过程



1.当程序开始运行的时候,将自己Load到内存区
2.此时操作系统也有一些代码在内存中,所以操作系统代码会找到该程序代码区的main方法并开始执行。
3.执行过程中的内存管理分为四部分:
code segment:代码区,用于存放代码。程序运行时将代码load到该区域。
datasegment:用于存放静态变量,字符串常量。
stack:栈,用于存放局部变量。1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。
heap:堆,用来动态生成内存,存放new出来的东西。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。
臭蛋丶 2017-05-18
  • 打赏
  • 举报
回复
栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。 但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 另外,栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的。 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。 但缺点是,由于要在运行时动态分配内存,存取速度较慢。
HinanaiTenshi 2017-05-17
  • 打赏
  • 举报
回复
不建议新人在很多常用语法语义都不熟悉的时候深入这个话题。 讨论这个问题之前,需要先想清楚另一个问题:栈和堆两种结构各有什么特点? 在想明白这一点的基础上,java为何把一些数据放在栈里,而一些数据放在堆里的问题更容易理解。
_MrRobot_ 2017-05-17
  • 打赏
  • 举报
回复
实例变量放堆区
若鱼1919 2017-05-12
  • 打赏
  • 举报
回复
推荐阅读《深入理解java虚拟机》周志明
  • 打赏
  • 举报
回复
引用 5 楼 m2200 的回复:
引用类型的变量也可以是局部变量,局部变量保存在栈区,可它所引用的对象保存在堆中或者常量池中。 一个对象中的成员变量,也就是你说的实例变量,跟对象在一起,对象在堆中,那么它也在堆中。
我觉得你说的是对的,现在这个问题有好多误导啊
sinat_31168349 2016-12-10
  • 打赏
  • 举报
回复
对象都放在堆上,栈保存基本类型的值、对象的引用(可以理解为对象在堆上的地址)。
爱睡觉的阿狸 2016-12-10
  • 打赏
  • 举报
回复
引用类型的变量也可以是局部变量,局部变量保存在栈区,可它所引用的对象保存在堆中或者常量池中。 一个对象中的成员变量,也就是你说的实例变量,跟对象在一起,对象在堆中,那么它也在堆中。
colie_li 2016-12-10
  • 打赏
  • 举报
回复
对象本身是放在堆里面,引用在栈里面,栈的操作实际上是方法的调用,对应着栈帧入栈和出栈
游一游走一走 2016-12-10
  • 打赏
  • 举报
回复
对象都在堆中,局部变量对象也在堆中,局部变量只是持有引用
moomx 2016-12-10
  • 打赏
  • 举报
回复
所有的实例变量,引用变量等等都在栈内存中(不管是实例还是引用存的的都是对象对应的地址,而不是对象本身). 对象本身以及对象的数据成员都在堆内存中.

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧