JVM-访问Java对象的底层分析

如何访问Java对象?底层解析

1、前提条件

​ 在我的上一篇文章https://blog.youkuaiyun.com/CodeDabaicai/article/details/107014400中,从JVM的角度出发分析了创建一个Java对象的五个基本步骤,并对一些由此引申出的问题进行了相关解析。

​ 创建对象之后,就涉及到使用对象的问题。那么一个Java对象的访问又是如何实现的呢?下边小王将进一步解析。

2、通过一个程序示例分析

class Person{
            private int id;
            private String name; 
        @Override
        public String toString() {
            return "Person{" +"id=" + id + ", name='" + name + '\'' +'}';
        }
}
 ........./............../...................
    @Test
    public void test2019() {
        Person person = new Person();
        person.name="Zhangsan";
        person.id=30;
        System.out.println(person);
    }

Java的引用访问主要涉及到三个内存区域,分别是:JVM的栈、堆、方法区。

Person person = new Person();

以这一段程序为例:Person person表示一个本地引用,存储在JVM栈的本地变量表中,表示一个reference类型的数据。

new Person()作为实例对象,存储在堆上。 堆上还记录了Object类的类型信息(接口、方法、field、对象类型等)的地址,这些地址指向的数据存储在方法区中。(JDK1.8方法区–>元空间)

通过reference类型引用具体对象的方法在Java虚拟机过反正并没有做出规动,现阶段主流的实现方式主要有两种,一种是通过句柄访问,另一种是通过直接指针访问。下边分别展开介绍。

3、通过句柄访问

​ 通过句柄访问的实现方式中,JVM堆中会专门有一块区域用来作为句柄池,存储相关句柄所执行的实例数据地址(包括在堆中地址和在方法区中的地址)。reference中存储的就是对象的句柄地址。这种实现方法由于用句柄表示地址,因此十分稳定。

4、通过直接指针访问

​ 通过直接指针访问的方式中,reference中存储的就是对象在堆中的实际地址,在堆中存储的对象信息中包含了在方法区中的相应类型数据,这时候Java堆对象的布局就必须考虑如何放置访问类型数据的相关信息。这种方法最大的优势是速度快,在HotSpot虚拟机中用的就是这种方式。
在这里插入图片描述

图片参考《深入理解Java虚拟机》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值