博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
@Java虚拟机之对象访问
阅读量:6998 次
发布时间:2019-06-27

本文共 858 字,大约阅读时间需要 2 分钟。

建立对象是为了使用对象,我们的java程序需要通过栈上的reference数据来操作堆上的具体对象。

对象访问会涉及到栈、Java堆、方法区这三个内存区域。

如下面这句代码:

Object objectRef = new Object();

假设这句代码出现在方法体中,"Object objectRef” 这部分将会反映到Java栈的本地变量中,作为一个reference类型数据出现。而“new Object()”这部分将会反映到Java堆中,形成一块存储Object类型所有实例数据值的结构化内存,根据具体类型以及虚拟机实现的对象内存布局 的不同,这块内存的长度是不固定。另外,在java堆中还必须包括能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些数据 类型存储在方法区中。

由于reference类型在java虚拟机规范中只是规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位、访问堆中对象的具体位置,所以对象访问方式

也是取决于虚拟机的具体实现。主流的方式有两种:使用句柄和直接指针。

句柄访问方式:如果使用句柄访问的话,那么在java堆中将划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据类型数据各自的具体地址信息。

指针访问方式:如果使用指针方式访问,reference变量中直接存储的就是对象的地址,而java堆对象一部分存储了对象实例数据,另外一部分存储了对象类型数据。

这两种访问对象的方式各有优势,使用句柄访问方式最大好处就是reference中存储的是稳定的句柄地址,在对象移动时只需要改变句柄中的实例数据指 针,而reference不需要改变。使用指针访问方式最大好处就是速度快,它节省了一次指针定位的时间开销,就虚拟机而言,它使用的是第二种方式(直接 指针访问)。

参考:

http://blog.csdn.net/java2000_wl/article/details/8015105

 

你可能感兴趣的文章
防抖和节流
查看>>
声网 Agora SDK 使用体验征文大赛
查看>>
写在 D2Admin 开源一个月之后
查看>>
JVM - 引用
查看>>
程序员欲跳槽阿里,却担心阿里加班太严重:网友:你先进去再说
查看>>
CSS @规则
查看>>
搭建hexo博客给公众号制作留言功能
查看>>
有胆就来测试 测完EtcGame让你惊喜!
查看>>
比特币前首席开发人员:LN可能还需要18个月
查看>>
C语言常被搞错的运算符优先级
查看>>
从零构建 Spark-机器学习 电影推荐系统(一) - 概述
查看>>
Xcode 上使用Reveal调试界面
查看>>
浅析如何通过 PHP 类的反射来实现依赖注入
查看>>
(一)Java B2B2C多用户商城 springcloud架构:Spring Cloud简介
查看>>
Unity(预设体)
查看>>
Grafana、elasticsearch、kafka、logstash和pinpoint结合
查看>>
使用jad反编译整个jar包
查看>>
Linux服务器安全策略
查看>>
php5类的使用_无需整理
查看>>
linux运维
查看>>