Java(七) 句柄

来源:互联网 发布:九帅网络机柜 编辑:程序博客网 时间:2024/06/06 04:55
    在学习什么是句柄之前我们先学习虚拟机的对对象的访问方式

一、句柄访问方式:

使用句柄访问对象,会在堆中开辟一块内存作为句柄池,句柄中储存了对象实例数据(属性值结构体)的内存地址,访问类型数据的内存地址(类信息,方法类型信息),

对象实例数据一般也在heap中开辟,类型数据一般储存在方法区中。使用句柄访问的好处是句柄中储存的是稳定的对象地址,当对象被移动时候,只需要更新句柄中的对象实例部分的值即可,句柄本身不用被移动修改。
句柄方式访问
二、指针访问方式:
直接指针访问方式指reference中直接储存对象在heap中的内存地址,但对应的类型数据访问地址需要在实例中存储,使用直接指针的好处相对于句柄来讲,少了一次指针定位时间的开销,缺点是,当对象被移动时(如进行GC后的内存重新排列),对象的引用(reference)也需要同步更新。
指针访问方式
注意:sun公司的hotspot虚拟机使用的是第二种方式,在频繁的对象访问过程中,由于节省一次指针定位开销,积少成多后的性能提升影响非常可观。
以上学习于ruiqingliang 图来自于信念_

什么是句柄

    句柄(Handle)来标示应用程序中不同的对象和同类中不同的实例    注意:句柄有人认为是指针、或者引用

下面就是一个简单的句柄(不怎么形象)

    class demo{        @Test        public void test(){            String s;//句柄            String s1=new String();句柄=实例对象            s1 = "a";//通过句柄操作对象            System.out.println(s1);            System.out.println(s1.hashCode());        }    }

句柄最简单的例子就是,把句柄看作一个遥控器(鼠标),而对象看作电视机(电脑),你可以通过遥控器的发出的频率来控制电视显示的节目(通过鼠标控制电脑的软件,来达到自己的自定义界面)
可以把String s;看成创建句柄(遥控器),而 new String() 看成对象(电视)而中间的‘=’号,你可以看成连接介质
以上学习与行者24岁和The灬Answer
方法运行解析

区分什么是指针/引用/句柄

1.指针是对象在内存中的地址;
2.引用是对象的别名,其实质就是功能受限但是安全性更高的指针;
3.句柄是指针的指针,句柄实际上是一个数据,是一个Long (整长型)的数据。句柄是一个标识符,是拿来标识对象或者项目的。

以上学习于jxiao_11

原创粉丝点击