V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yangyuhan12138
V2EX  ›  Java

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

  •  
  •   yangyuhan12138 · 2020-04-18 16:13:08 +08:00 · 1596 次点击
    这是一个创建于 1691 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    3 条回复    2020-04-18 16:57:08 +08:00
    guyeu
        1
    guyeu  
       2020-04-18 16:38:24 +08:00
    成员变量的值显然保存的是引用而不是数据本身。
    secondwtq
        2
    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
        3
    yangyuhan12138  
    OP
       2020-04-18 16:57:08 +08:00
    @guyeu 我刚 Google 了一下发现确实是我像这样 是存的 oops ( Ordinary Object Pointers )
    @secondwtq 我懂了 基本类型直接存,引用类型存指针
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5369 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:23 · PVG 17:23 · LAX 01:23 · JFK 04:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.