小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
在Java语言中对象访问是如何进行的?以下面代码为例
Object obj = new Object();
如果这行代码在方法中,那么Object obj
会存储在Java栈的局部变量表中,类型为对象引用类型(reference类型)。new Object()
反映在Java堆中,在堆中开辟一块内存用于存储Object类型所有实例数据值的结构化内存,根据其实际类型和虚拟机实现对象内存布局的不同,这块内存的长度不固定。另外在堆的方法区中包含了该对象类型数据的地址信息,可以查询到对象类型、父类、实现的接口、方法等。
对于对象引用类型,Java虚拟机规范中只规定了一个指向对象的引用,没有定义引用以何种方式去定位到堆中的具体对象,因此不同虚拟机实现对象访问的方式不同,主流有:使用句柄和直接指针
句柄访问
Java堆中划分一块内存作为句柄池,reference中存储对象句柄的地址,句柄中包含对象实例数据与类型数据各自具体的地址信息。
使用句柄访问可以在对象被移动时(发生了垃圾收集)只需要改变句柄中的对象实例数据指针,而不需要改变reference本身。
直接访问
Java堆中对象需要存储能够指向方法区中的对象类型数据的信息,reference中直接存储对象地址。
使用直接指针节省了一次指针定位的时间开销,可以让访问速度更快。