java 对象地址_Java对象的访问方式

之前写过一篇随笔

现在看看,貌似不是很准确,方法区和栈应当区分开来,两者有很大的区别

看下面的一个对象,如何进行引用,引用变量如何存储,对象信息又存储在哪儿

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的引用访问涉及到3个内存区域:JVM栈,堆,方法区。

以最简单的本地变量引用: Person person = new Person()为例:

Person person 表示一个本地引用,存储在JVM栈的本地变量表中,表示一个reference类型数据;

new Person()作为实例对象数据存储在堆中;

堆中还记录了Object类的类型信息(接口、方法、field、对象类型等)的地址,这些地址所执行的数据存储在方法区中;

在Java虚拟机规范中,对于通过reference类型引用访问具体对象的方式并未做规定,目前主流的实现方式主要有两种:

1,通过句柄访问(图来自于《深入理解Java虚拟机:JVM高级特效与最佳实现》):

c85d17e5d5a87fcec5370e9b1259e42f.png

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

2,通过直接指针访问:(图来自于《深入理解Java虚拟机:JVM高级特效与最佳实现》)

f693b37479e98e985a64ef7110789f40.png

通过直接指针访问的方式中,reference中存储的就是对象在堆中的实际地址,在堆中存储的对象信息中包含了在方法区中的相应类型数据。这种方法最大的优势是速度快,在HotSpot虚拟机中用的就是这种方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值