JVM学习笔记(二)

上文,已经学习了JVM在运行java程序时。JVM的内存区域划分。以及各区域的作用。
接下来开始学习 
2. 对象的访问
      在 java中。对象的访问是十分普遍的。即时是最简单的访问。都会设计到 java栈。java堆。方法区。
举个栗子

Object object = new Object();

    这上面的栗子中,Object object  会放到java栈的本地变量中,作为一个引用类型数据出现。 new Object() 会出现在 堆中,形成了一块存储object类型所有实例数据值(各个实例字段的数据)的结构化内存。
并且,java堆中还必须包含能够查找到此对象类型数据(如对象类型,父类,实现的接口,方法等)的地址信息,这些数据类型则储存在方法区中
由于引用类型在java虚拟机规范里面只规定了一个指向对象的引用。但是并没有规定这个引用应该通过那种方式去定位,以及访问java堆中对象的具体地址。

现在主流方式有两张:使用句柄跟直接指针。
使用句柄:在java堆中开辟一块内存来作为句柄池,那么本地变量表的引用(reference)存的就是对象的句柄地址。而句柄中包含了对象实例数据与对象类型数据的具体地址。

 

 直接指针:java堆对象的布局就必须考虑如何放置访问类型数据的相关信息,reference直接存储的就是对象地址。

 

 这两张方式各有优势。使用句柄访问方式最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动的时候(垃圾收集时,移动对象是非常普遍的行为),只会改变
句柄中的实例数据指针,而reference本身不需要修改
指针访问方式最大的好处就是速度更快,节省了一次指针定位的时间开销,由于对象访问在java中十分频繁。积少成多后也是一项非常可观的执行成本。
Sun HotSpot  采用的就是第二种访问方式。


 

posted @ 2020-03-04 09:01  小羊小恩  阅读(143)  评论(0)    收藏  举报