JVM内存管理机制( 四 )


主流的访问方式有使用句柄和直接指针两种:
句柄访问
如果使用句柄访问的话 , Java堆中将会划分出一块内存来作为句柄池 , reference中存储的就是对象的句柄地址 , 而句柄中包含了对象实例数据与类型数据的具体各自的地址信息 。

JVM内存管理机制

文章插图
 
指针访问对象
使用直接指针访问的话 , Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息 , reference中存储的直接就是对象地址 。
JVM内存管理机制

文章插图
 
这两种对象访问方式各有优势 , 使用句柄来访问的最大好处就是reference中存储的是稳定句柄地址 , 在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针 , 而reference本身不需要被修改 。
使用直接指针来访问最大的好处就是速度更快 , 它节省了一次指针定位的时间开销 , 由于对象访问的在Java中非常频繁 , 因此这类开销积小成多也是一项非常可 观的执行成本 。从上一部分讲解的对象内存布局可以看出 , 就虚拟机HotSpot而言 , 它是使用第二种方式进行对象访问 , 但在整个软件开发的范围来看 , 各种 语言、框架中使用句柄来访问的情况也十分常见 。
本文主要参考《深入理解Java虚拟机:JVM高级特性与最佳实践》后的学习笔记及总结 。




推荐阅读