Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(三)
2023-03-14 10:23:01 时间
本文内容总结自周志明先生所编著的《深入理解Java虚拟机-JVM高级特性与最佳实践》此书的经典不必多说。本节内容是对象的定位访问。
在java中我们无时无刻不在创建对象,我们创建对象的目的当然是为了使用它了。但是我们怎么才能使用操作创建的对象呢?我们的java程序会通过栈上的reference数据(指向对象的引用)来操作堆上的具体对象。那这个对象的引用是通过什么方式去定位、访问堆中的对象的具体位置呢?目前主流的访问方式大概有以下两种:使用句柄和直接指针两种方式。
使用句柄:
如果是使用句柄的方式访问对象的话,就需要在java堆中划出一块内存作为句柄池,而reference(对象引用)中存储的就是对象的句柄地址。在这个句柄中包含了对象实例数据类型与类型数据各自的具体地址信息。如下图所示(仔细观察本地变量表中的东西看看有什么发现):
直接指针
如果使用指针访问,那么堆对象的布局就必须考虑如何放置访问类型数据的相关信息,而reference中存储的就是对象的地址。如下图所示:
使用句柄访问对象的最大好处是reference中存储的是稳定的句柄地址,在对象被移动(比如垃圾回收的时候)时只会改变句柄中实例数据的指针。使用直接指针访问的最大好处是速度快,因为它节省了一次指针定位的时间开销(如上图所示).在HotSpot虚拟机中它是采用直接指针来进行对象的访问的。
相关文章
- Java要抛弃祖宗的基业,Java程序员危险了!
- 十大 Java 语言特性
- JVM 三色标记算法,原来是这么回事!
- 聊聊 Spring 事务控制策略以及 @Transactional 失效问题避坑
- 写给 Java 程序员的前端 Promise 教程
- 写给 Java 程序员的前端 Promise 教程,你学会了吗?
- Java 中为什么不全部使用 Static 方法?
- Java 池化技术你了解多少?
- Java 服务 Docker 容器化优秀实践
- Spring Boot + EasyExcel导入导出,简直太好用了!
- 我们一起聊聊 Java 内存泄漏
- CentOS 下安装 Docker 极简教程
- JDK 19 功能集冻结:Java 19 只有七个新特性
- 关于 CMS 垃圾回收器,你真的懂了吗?
- 为什么会有这么多编程语言?
- 改善Java代码的八个建议
- 接口流量突增,如何做好性能优化?
- Java 以编程方式创建JAR文件
- POJO、Java Bean是如何定义的
- Spring 的 Bean 明明设置了 Scope 为 Prototype,为什么还是只能获取到单例对象?