HotSpot 虚拟机对象的实例数据部分是否存的是地址值?

2020-04-18 16:13:08 +08:00
 yangyuhan12138

在 HotSpot 虚拟机中,对象的内存布局分为以下 3 块区域:

对象头( Header ) 实例数据( Instance Data ) 对齐填充( Padding )

###实例数据 实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量。

我的疑问是,实例数据这部分(成员变量)是否存的是地址值指向堆中的另一个对象? 由于对象创建应该是先申请内存(对象所需内存的大小在类加载完成后便可完全确定)所以在堆内存中相同类所创建地对象应该是一样大的呀,就拿 hashmap 来说,hashmap 内部维护的 node 数组,在扩容的时候会新建一个数组,并将指针指向他,如果实例数据这部分是存的数组本身的话,根本就没办法扩容了

1607 次点击
所在节点    Java
3 条回复
guyeu
2020-04-18 16:38:24 +08:00
成员变量的值显然保存的是引用而不是数据本身。
secondwtq
2020-04-18 16:42:55 +08:00
你这个问题跟 https://v2ex.com/t/663545 这里的楼主是类似的:混淆了 Primitive 值和 Reference 值
学习 C++ 也可以解决这个问题(其实学 C 就可以,不过 C 太乱了)

Primitive 值是可以直接存的,Reference 值始终存的是指向另一个对象的指针。而从底层的角度,把 Reference 当成指针 Primitive 看待,这问题就解决了。

楼主想想就知道如果“A 对象的实例数据部分存的是指向 B 对象的地址”,那么 B 对象的实例数据存在哪里?存一个指向 C 对象的指针?这就一直套娃了
而且楼主明显是知道“新建一个数组,并将指针指向他”的 ...
yangyuhan12138
2020-04-18 16:57:08 +08:00
@guyeu 我刚 Google 了一下发现确实是我像这样 是存的 oops ( Ordinary Object Pointers )
@secondwtq 我懂了 基本类型直接存,引用类型存指针

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/663765

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX