深入理解 Java 虚拟机 学习:对象访问

Java 虚拟机 其他相关博客

深入理解 Java 虚拟机 学习:Java虚拟机内存区域
深入理解 Java 虚拟机 学习:总结 GC 的知识点,面试问 GC 有这一篇就足够了

对象访问

学习资料:《 深入理解 Java 虚拟机:JVM高级特性与最佳实践》

对象访问在 Java 语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会涉及 Java 栈,Java
堆,方法区这三个做重要的内存区域之间的关联关系。

Object obj = new Object();

这句代码会分成两部分存储

  • Object obj 这部分的语义会反映到 Java 栈的本地变量表中,作为一个 reference 类型数据出现
  • new Object() 这部分的语义将会反映到 Java 堆中,形成一块存储了 Object 类型所有实例数据值的结构化内存,根据具体类型及虚拟机实现的对象内存布局的不同,这块内存的长度是不固定的。另外,在 Java 堆中还必须包含能查找到的对象类型数据(如对象类型,父类,实现的接口,方法等)的地址信息,这些类型数据则存储在方法区中
  • reference 类型在 Java 虚拟机规范里面之规定一个指向对象的引用,没有定义引用以那种方式去定位,和访问到 Java 堆中对象的具体位置,所以不同虚拟机中对象的访问方式也会有差距,主流访问有两种:句柄直接指针

句柄

Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息

  • 优点:reference 中存储的是最稳定的句柄地址,在对象被移动(垃圾回收时移动对象时非常普遍的行为)时只会该变句柄中的实例数据指针,而reference 本身不需要被修改

深入理解 Java 虚拟机 学习:对象访问_第1张图片

直接指针访问

直接指针访问,Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息reference 中直接存储的就是对象地址

  • 优点:最大的好处就是速度更快,节省了一次指针定位的时间开销,由于对象的访问是非常频繁,因此这类开销也是可观的,也是经常使用的(虚拟机 Sun HotSpot 使用的)

深入理解 Java 虚拟机 学习:对象访问_第2张图片

你可能感兴趣的:(JVM,jvm,java)