漫画:对象是如何被找到的?句柄 OR 直接指针?

小贴士:想要使用并定位 Java 对象,就要用到 Java 虚拟机栈(Java Virtual Machine Stack),它描述的是 Java 方法执行的线程内存模型:每个方法被执行的时候,Java 虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

代码解读

以下面代码为例,来说明对象定位的过程:

class Bus extends Car {private String code;private String color;Bus(String code, String color) {this.code = code;this.color = color;}// 省略其他方法...
}
public class ReferenceTest {Bus myBus = new Bus("Java中文社群", "蓝色");
}

以官方默认的 HotSpot 虚拟机来说, myBus 就是存储在本地变量表中 reference 类型的变量, new Bus("Java中文社群", "蓝色") 就是存储在 Java 堆中的对象实例数据,它存储了此实体类的所有字段信息,例如 code="Java中文社群" 以及 color="蓝色" 等信息,而 Java 堆中的还存储着对象类型数据的地址,它存储的是对象的类型信息,还有它的父类信息等。

总结

由于 reference 类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用,并没有定义这个引用应该通过什么方式去定位、访问到堆中对象的具体位置,所以对象访问方式也是由虚拟机实现而定的,主流的访问方式主要有使用句柄和直接指针两种:

  • 如果使用句柄访问的话,Java 堆中将可能会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息;

  • 如果使用直接指针访问的话,Java 堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信息,reference 中存储的直接就是对象地址,如果只是访问对象本身的话,就不需要多一次间接访问的开销。

因此使用句柄来访问的最大好处就是 reference 中存储的是稳定句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而 reference 本身不需要被修改。使用直接指针访问速度更快,但如果对象被移动则需要修改 reference 本身。

由于对象访问在 Java 中非常频繁,因此这类开销积少成多也是一项极为可观的执行成本,所以官方默认的 HotSpot 虚拟机采用的就是「直接指针」来定位对象的。

参考 & 鸣谢

周志明《深入理解Java虚拟机》第 3 版

最后的话原创不易,都看到这了,点个「在看」再走呗,这是对我最大的支持与鼓励,谢谢你!PS:公众号推送最近改版了,朋友们设置为星标,防止错过精彩内容。往期推荐

漫画:Java如何实现热更新?

为什么建议你使用枚举?

关注下方二维码,每一天都有干货!

点亮“在看”,助我写出更多好文!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在C ++中检查一个数组是否是另一个数组的子数组

Prerequisite: std::equal() function 先决条件: std :: equal()函数 Problem statement: 问题陈述: Check if one array is subarray of another or not. 检查一个数组是否是另一个数组的子数组。 Example: 例: Input 1:Arr1 [3, 4, 5, …

第二章 认识计算机硬件

*(%)^*&!*第一讲 认识计算机主板一、主板的结构1、主板结构分类(2)AT、Baby-AT型(2)ATX型(3)Micro ATX板型(4)LPX、NLX、Flex ATX板型(5)EATX、WATX板型&…

IDEA 不为人知的 5 个骚技巧!真香!

工欲善其事,必先利其器,磊哥最近发现了几个特别棒的 IDEA“骚”技巧,已经迫不及待的想要分享给你了,快上车...1.快速补全行末分号使用快捷键 Shfit Ctrl Enter 轻松实现。2.自带的 HTTP 请求工具IDEA 自带了 HTTP 的测试工具&am…

教育编程语言(转)

这是wikipedia上的内容,转载保存,以便以后查阅,英文版见Educational programming language 主要是介绍了一些适合于教育的编程语言,分别适合于不同的个人需求。 详细内容如下: 许多教育性质的程序设计语言都提供建议…

JavaScript | 将十进制转换为十六进制,反之亦然

Sometimes we need to convert an integer value which is in decimal format to the hexadecimal string in JavaScript or need a decimal value from a given hexadecimal string. 有时,我们需要将十进制格式的整数值转换为JavaScript中的十六进制字符串&#xf…

漫画:Integer 竟然有 4 种比较方法?

代码测试public class IntegerTest {public static void main(String[] args) {Integer i1 127;Integer i2 127;System.out.println(i1 i2);Integer i3 128;Integer i4 128;System.out.println(i3 i4);} }以上代码的执行结果为:truefalse首先,当我…

第三章 组装个人计算机

*(%)^*&!*第一讲 选购个人计算机部件1、计算机配件选购的基本原则(1)组装电脑按需配置,明确电脑使用范围;(2)衡量装机预算;(3)衡量整机运行速度。2、电脑配件选购注意…

IP地址的分类——a,b,c 类是怎样划分的

如今的IP网络使用32位地址,以点分十进制表示,如172.16.0.0。地址格式为:IP地址网络地址+主机地址 或 IP地址主机地址+子网地址+主机地址。 IP地址类型 最初设计互联网络时,为了便于寻址以及层次…

《Introduction to Computing Systems: From bits and gates to C and beyond》

很好的一本计算机的入门书,被很多学校采纳作为教材,作者Yale N. Patt 是计算机界的泰斗。中文版名为《计算机系统概论》(译者:梁阿磊 , 蒋兴昌, 林凌) 书籍首页 (旧版首页 ) LC-3相关工具 LC-3Help 采…

在数组中查找第k个最大元素_查找数组中每个元素的最近最大邻居

在数组中查找第k个最大元素Problem statement: 问题陈述: Given an array of elements, find the nearest (on the right) greatest element ofeach element in the array. (Nearest greatest means the immediate greatest one on the right side). 给定一个元素数…

6种快速统计代码执行时间的方法,真香!(史上最全)

我们在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Java 中比较常用的执行时间统计方法,总共…

fltk 库

fltk是一个小型、开源、支持OpenGL 、跨平台(windows,linux,mac OSX)的GUI库,它兼容xforms 图形库(unix/linux下的一个C语言图形库),所以可以用来开发模块化的程序,同时也可以使用面向对象开发程序,使用起来…

人工智能ai 学习_人工智能中强化学习的要点

人工智能ai 学习As discussed earlier, in Reinforcement Learning, the agent takes decisions in order to attain maximum rewards. These rewards are the reinforcements through which the agent learns in this type of agent. 如前所述,在“ 强化学习”中 &…

第四章 计算机软件安装与调试

*(%)^*&!*第一讲 系统BIOS和CMOS参数设置(1)一、BIOS、CMOS的基本概念1.BIOS的含义BIOS是只读存储器基本输入/输出系统的简写,是被雇花道计算机主板ROM芯片上的一组程序,为计算机提供最低级、最直接的硬件控制。2.CMOS的含义C…

连夜整理了几个开源项目,毕设/练手/私活一条龙!

一直以来,总有小伙伴问说:诶,有没有什么好的项目推荐啊,想参考使用。一般用途无非如下几种情况:自学练手:从书本和博客的理论学习,过渡到实践练手吸收项目经验,找工作写简历时能参考…

MPI编程简单介绍

第三章 MPI编程 3.1 MPI简单介绍 多线程是一种便捷的模型,当中每一个线程都能够訪问其他线程的存储空间。因此,这样的模型仅仅能在共享存储系统之间移植。一般来讲,并行机不一定在各处理器之间共享存储,当面向非共享存储系统开发…

英语电视节目网站

最近想练习一下英语听力,看到了一个网站,感觉好像还不错,播放比较流畅,语速相对来说比较慢,发音比较清晰。 链接:CSPAN 还有更多网站见:Broadband-Television BON CNC 英文在线广播&#x…

三位bcd加法计数器_两个8位BCD编号的加法| 8085微处理器

三位bcd加法计数器Problem statement: 问题陈述: To perform addition operation between two 8-bit BCD numbers using 8085 microprocessor. 使用8085微处理器在两个8位BCD编号之间执行加法运算。 Algorithm: 算法: Load the two numbers in HL pai…

第五章 计算机故障诊断与排除

*(%)^*&!*第一讲 计算机故障基础及电源类故障诊断和维护一、计算机故障的分类1.硬件故障硬件故障是指用户使用不当或由于电子元件故障而引起计算机硬件不能正常运行的故障。常见的硬件故障现象包括:(1)电源故障,导致没有供电或…

图灵奖演讲稿

刚刚读温伯格 的《理解专业程序员》,书中提到Floyd 图灵奖演讲中关于编程范式(programming paradigm )(also see here )的演讲稿值得每个与编程有关的人一读,所以搜索了一些图灵奖相关的一些网络资源。 图灵奖主页 部分图灵奖演讲稿 其他资…