原博客地址:http://www.solr.cc/blog/?p=242
今天说说 java的对象访问.
对象访问会涉及到 栈、堆、方法区这三个内存区域。对象访问主要有两种:句柄访问和指针放访问。
上图(源于网络):
前面我们分析过内存各部分的功能,栈中存放的是变量表,堆中存放对象实例,方法去存放类信息(如类名 父类 接口实现等)。这样从两个图中不难发现访问对象的流程是一致 都是通过栈中对象的引用到堆中寻找实例,实例又需要到方法区中找到类的基本信息。两者不同的地方在于堆的处理上。
通过句柄进行访问:将堆又划分为两个区域句柄区和实例区,栈中的reference指向句柄区的句柄,句柄我们可以理解为存放两个指针的结构体。一个存储实例区的地址,一个指向方法区的地址。
通过引用访问:栈中reference直接指向实例对象,实例对象中直接记录方法区中的地址。
优缺点:通用JDK使用的是通过引用直接访问的方式,优点就是访问性能高(比句柄访问少一次寻址),缺点就是对象迁移(拷贝)频繁,在垃圾回收过程中消耗更多的资源。