对象的访问假设这句代码出现在方法体中 Object obj = new Object();
假设这句代码出现在方法体中, 那 "Object obj" 这部分的语义将会反映到 Java 栈的本地变量表中, 作为一个 reference 类型数据出现. 而 "new Object()" 这部分的语义将会反映到 Java 堆中, 形成一块存储了 Object 类型所有实例数据值的结构化内存, 根据具体类型以及虚拟机实现的对象内存布局的不同, 这块内存的长度是不固定的. 另外, java 堆中存放着查找此对象类型数据 (如对象类型, 父类, 实现的接口, 方法等) 的地址信息, 这些类型数据则存储在方法区中.
由于 reference 类型在 Java 虚拟机规范里面只规定了一个指向对象的引用, 并没有定义这个引用应该通过哪种方式定位, 以及访问到 Java 堆中的对象的具体位置, 不同虚拟机实现的对象访问方式会有所不同, 主流的访问方式有两种: 使用句柄和直接指针.
1. 句柄访问方式, java 堆中将会划分出一块内存来作为句柄池, reference 中存储的就是对象的句柄地址, 而句柄中包含了对象实例数据和类型数据各自的具体地址信息
2. 如果使用直接指针访问方式, Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息, reference 中直接存储的就是对象地址
来源: http://www.bubuko.com/infodetail-2996236.html