java中所有的对象都在堆内存中分配空间对吗 来讨论讨论

qq_27256659 2016-12-13 04:51:47
赞同这句话的我会继续问
...全文
784 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2019-12-27
  • 打赏
  • 举报
回复
引用 2 楼 qq_27256659 的回复:
所以我对这句话有疑问啊 ,我的理解是这样的 ,上面的这句话没错,所有对象都存放在堆中,至于字符串常量池绝大多数人说里面存放的是字符串对象本身,而我觉得是对象引用,真正的字符串对象还是在堆中

随着JIT的发展,逃逸分析的优化,对象不一定都在堆内存中分配。
至于字符串常量(这里应该指全局字符串常量池吧),它的本质是一个引用维护表(StringTable),所以存的对象的引用,字符串对象本身还是存在于堆中。
旧城以西 2019-12-26
  • 打赏
  • 举报
回复
在不同的版本下是不一定的,jdk8就不一定。 使用的技术是: 逃逸分析,栈上分配,标量替换这些。
神盾局码农~ 2019-07-26
  • 打赏
  • 举报
回复
作为一个新手程序员,但是爱瞎研究的我: 在jdk7以前常量池在方法区里面, 在jdk7的时候放到了永久代中,而永久代在堆中 在jdk8的时候取消了永久代,改成元空间区(元数据区),而元数据区已经不再jvm上了,之前的版本都还在jvm上,而是在本地内存上,这也是jdk8之后的一个大改变吧,从此元数据区只受内存大小的限制了 还有一个对象逃逸问题,如果这个对象开销小并且还没有发生逃逸现象,他会被直接分配到栈上的,所以所有对象都在堆上是不对的
yuqi_hz 2017-01-05
  • 打赏
  • 举报
回复
new的都是在堆中
xxdmmsxxdjava 2017-01-04
  • 打赏
  • 举报
回复
我内存 空间学的不好咋办 好难记
李德胜1995 2017-01-04
  • 打赏
  • 举报
回复
内存逃逸技术可以使对象在栈上分配吧
树成 2017-01-03
  • 打赏
  • 举报
回复
引用 6楼我是你的主体 的回复:
[quote=引用 4 楼 spiniper 的回复:] 对象都是放在堆中的,字符串对象也是,放在常量池中的是字符串不是对象,把字符串和字符串对象两个概念区分开来
字符串和字符串对象是两个概念 你这种说法好像没什么依据吧 ,按照你说的,String a = "ss",这句代码就有矛盾了,如果“”ss”不是字符串对象,那它怎么可以被String 类型引用。[/quote]这当然有依据咯,你之所以产生这种疑问是因为你理解视角混乱造成的,对于java内的字符串,你不能只从java语言的语法层面去理解,你要从实际的内存结构去理解,如果只是语法层面,你只要知道String是字符串对象即可,但是你要更深入理解它在内存中的形式你就要抛弃java语法层面,从实际内存来出发了。 你学过C应该知道字符串实际上就是char类型数组以一个空结尾既是字符串,其实java是一样的,因为虚拟机就是C开发的,早在1.6版本,jvm还是开源的。 具体的内存结构比较复杂,你可以看虚拟机规范,也可以查阅jvm相应书籍,在java中除了字符串还有Class类以及反射相关的一系列东西都和字符串类似,如果你认为java中的类是Class的对象,那你就大错特错了
ryuugu_rena 2017-01-03
  • 打赏
  • 举报
回复
String也是类,即他是一个对象,只不过他比较特殊而已。你可以不用了解它的特殊之处,只需要知道它就是个对象就行了。
qq_27256659 2017-01-03
  • 打赏
  • 举报
回复
引用 4 楼 spiniper 的回复:
对象都是放在堆中的,字符串对象也是,放在常量池中的是字符串不是对象,把字符串和字符串对象两个概念区分开来
字符串和字符串对象是两个概念 你这种说法好像没什么依据吧 ,按照你说的,String a = "ss",这句代码就有矛盾了,如果“”ss”不是字符串对象,那它怎么可以被String 类型引用。
Be_nurturing 2016-12-14
  • 打赏
  • 举报
回复
Mark~~
树成 2016-12-13
  • 打赏
  • 举报
回复
对象都是放在堆中的,字符串对象也是,放在常量池中的是字符串不是对象,把字符串和字符串对象两个概念区分开来
爱睡觉的阿狸 2016-12-13
  • 打赏
  • 举报
回复
引用 2 楼 qq_27256659 的回复:
[quote=引用 1 楼 m2200 的回复:] 你不都写了还有字符串常量池么
所以我对这句话有疑问啊 ,我的理解是这样的 ,上面的这句话没错,所有对象都存放在堆中,至于字符串常量池绝大多数人说里面存放的是字符串对象本身,而我觉得是对象引用,真正的字符串对象还是在堆中[/quote] 继续说,依据呢?
qq_27256659 2016-12-13
  • 打赏
  • 举报
回复
引用 1 楼 m2200 的回复:
你不都写了还有字符串常量池么
所以我对这句话有疑问啊 ,我的理解是这样的 ,上面的这句话没错,所有对象都存放在堆中,至于字符串常量池绝大多数人说里面存放的是字符串对象本身,而我觉得是对象引用,真正的字符串对象还是在堆中
爱睡觉的阿狸 2016-12-13
  • 打赏
  • 举报
回复
你不都写了还有字符串常量池么

62,628

社区成员

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

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