JVM内存管理-对象访问

程序运行时,最基本的需要使用jvm中的栈、堆、方法区,这三部分内容。

栈,存放了方法所需要的局部变量等信息。

堆,存放了类的实例化数据(即对象)。

方法区,存放了类的相关信息(class文件的信息),比如父类、接口等信息。

以下段代码为例:

Object obj = new Object();

它对应的内存示例如下图所示:


以上部分是比较基础的,但是stack和heap和方法区之间是如何联系的呢?

由于JVM规范中,对引用类型的规定是只代表着一个对象实例的引用,并没有制定具体使用哪种方式去实现,因此,出现两种可能。一、句柄方式;二、直接引用。

1、句柄引用

句柄引用的方式,是通过在堆中增加一块句柄区域,栈中的数据指向句柄,句柄中包含了堆中实例的地址和方法区中class信息的地址。如下图所示:


2、直接引用

直接引用的方式去掉了句柄区域,直接在堆的对象实例区域中包含了一块执行方法区中class文件的地址。如下图所示:


sun的虚拟机实现的是第二种方式,实现第一种方式的也比较多。

两种方式的比较:

第一种方式若对象实例发生拷贝时,不需要改变栈中变量的指向,只需要改变句柄内存的指向即可。

第二种方式的优点是速度快,毕竟少了一个过程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值