java 对等体,JAVA 对象的表示模型和运行时内存表示

There’s only one line of footprints here, because I’m carrying you on the worst days.:-)

<

Hotspot主要是用C++写的,所以它定义的Java对象表示模型也是基于C++实现的。

Java对象的表示模型叫做“OOP-Klass”二分模型,包括两部分:

1.OOP,即Ordinary Object Point,普通对象指针。说实话这个名称挺难理解。说白了其实就是表示对象的实例信息

2.Klass,即Java类的C++对等体,用来描述Java类,包含了元数据和方法信息等

JVM运行时加载一个Class时,会在JVM内部创建一个instanceKlass对象,表示这个类的运行时元数据。创建一个这个Class的Java对象时,会在JVM内部相应的创建一个instanceOop来表示这个Java对象。instanceKlass对象放在了方法区,instanceOop放在了堆,instanceOop的引用放在了JVM栈

JVM是基于栈来运行的,当一个线程调用一个对象的方法时,会在它的JVM栈的栈顶创建一个栈帧(Frame)的数据结构,这个数据结构是用来保存方法的局部变量,操作数栈,动态连接和方法返回值的。通过参数传递的值和在方法中new出来的对象的引用都保持在局部变量表里面。

Java的方法调用是值传递,不是引用传递,原因就在这里,传递进来的参数相当于在局部变量表里面拷贝了一份,实际计算时,操作数栈操作的是局部变量变量里面的值,而不是外部的变量。

18731b93cfdf698b30f51cbcc4ec6e62.png

在堆中创建的Java对象实际只包含数据信息 包含三个部分

1.对象头,也叫Mark Word

2.元数据指针,可以理解为类对象指针,指向方法区的instanceKlass实例

3.实例数据

4.如果是数据对象的话,还多了一个部分,就是数组长度。

2d020e1998203969055590f19a4e5631.png

对象头主要存储对象运行时记录信息,如hashcode, GC分代年龄,锁状态标志,偏向线程ID,偏向时间戳等。对象头的长度和JVM的字长一致,比如32位JVM的对象头是32位,64位JVM的对象头是64位。

这里可以看到,所谓的给一个对象加锁,其实就是设置了对象头某些位。当其他线程看到这个对象的状态是加锁状态后,就等待释放锁。

在方法区的instanceKlass对象相当于Class加载后创建的运行时对象,它包含了运行时常量池,字段,方法等元数据,当调用一个对象的方法时,如上面的图所示,实际定位到了方法区的instanceKlass对象的方法元数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值