java语言对象访问的背后
2012-07-23 17:38
176 查看
对象访问在java语言中无处不在,是最普遍的程序行为,但即使是最简单的访问,也会涉及到java堆、java栈、方法区这三个最重要的内存区域之前的关联关系。下面我们就来看一下java中对象访问是怎么回事。
如果在方法中出现如下这句代码:
Object obj = newObject();
那Object obj这个引用变量会存放在java栈的本地变量表中,作为一个reference类型数据,它指向了一个对象的引用,即指向堆中对象起始地址的引用指针或一个代表对象的句柄,不同的虚拟机有不同的实现,这在接下来会讨论。
而new Object()会在java堆中分配一块内存,用于存放Object类型的实例数据值,这块内存的大小是不固定的。此外,在java堆中还包含了能查找到此对象类型数据(对象类型、父类[当然Object没有父类]、实现的接口、方法等,这些类型数据存储在方法区中)的地址信息,即指向方法区的一个指针。
上面说到,reference类型指向了一个对象的引用,而不同的虚拟机在确定这个的具体位置时,有不同的实现,主流的有两种方式:
1、句柄访问方式:java堆中将会划分出一块内存来作为句柄池,reference中存放的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据的地址信息,如下图所示:
2、直接指针访问方式:reference中直接存放的就是对象的地址,如下图所示:
句柄访问方式的优点是reference中存放的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是很普遍的)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。
直接指针访问方式的优点是速度快,它节省了一次指针定位的时间开销,由于对象的访问在java中非常频繁,因此这类开销的执行成本也很高。Sun的HotSpot使用的就是这种对象访问方式。
如果在方法中出现如下这句代码:
Object obj = newObject();
那Object obj这个引用变量会存放在java栈的本地变量表中,作为一个reference类型数据,它指向了一个对象的引用,即指向堆中对象起始地址的引用指针或一个代表对象的句柄,不同的虚拟机有不同的实现,这在接下来会讨论。
而new Object()会在java堆中分配一块内存,用于存放Object类型的实例数据值,这块内存的大小是不固定的。此外,在java堆中还包含了能查找到此对象类型数据(对象类型、父类[当然Object没有父类]、实现的接口、方法等,这些类型数据存储在方法区中)的地址信息,即指向方法区的一个指针。
上面说到,reference类型指向了一个对象的引用,而不同的虚拟机在确定这个的具体位置时,有不同的实现,主流的有两种方式:
1、句柄访问方式:java堆中将会划分出一块内存来作为句柄池,reference中存放的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据的地址信息,如下图所示:
2、直接指针访问方式:reference中直接存放的就是对象的地址,如下图所示:
句柄访问方式的优点是reference中存放的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是很普遍的)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。
直接指针访问方式的优点是速度快,它节省了一次指针定位的时间开销,由于对象的访问在java中非常频繁,因此这类开销的执行成本也很高。Sun的HotSpot使用的就是这种对象访问方式。
相关文章推荐
- java语言对象访问的背后
- JNI学习笔记(四)JNI中本地语言创建Java对象并且访问具体方法(附例子)
- JNI学习笔记(四)JNI中本地语言创建Java对象并且访问具体方法(附例子)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(12)--类成员的访问控制
- Java OQL(对象查询语言)
- 用JAVA语言编写程序:包含两个类,一个类Cricle中包含计算圆周长,面积的方法。在另一个类Compute中给出半径值为10,创建对象,并调用Cricle类中的方法,计算该对象的面积、周长并显示出结
- java语言基础(48)——局部内部类访问外部成员和局部成员
- Java在项目启动时访问数据库,在ServletContextListener解决对象无法注入问题
- javaSE_8系列博客——Java语言的特性(三)--类和对象(17)--嵌套类(本地/局部类)
- 当JNI遇到多线程--java对象如何被C++中的多个线程访问?
- apache commons JXPath 说明,使用JXPath访问java对象、集合和XML文件
- java 中通过引用变量访问对象
- Java语言基础:对象的初始化
- javaSE_8系列博客——Java语言的特性(三)--类和对象(8)--对象
- JVM-JAVA对象的访问
- java-类与对象(访问对象的属性和行为)、
- javaSE_8系列博客——Java语言的特性(三)--类和对象(10)--对象的使用
- 用 Java 访问 Domino 的对象(三)
- java语言基础(44)——不同包下类之间的访问及import关键字的引入
- 黑马程序员——Java语言--面向对象(二)