jvm(2)类的初始化(二)和实例化

深入理解Java对象的创建过程:类的初始化与实例化 

对象实例化内存分析:

 对内存分配情况分析最常见的示例便是对象实例化:

Object obj = new Object();

这段代码的执行会涉及java栈、Java堆、方法区三个最重要的内存区域。

  • 该语句出现在方法体中,obj会作为引用类型(reference)的数据保存在Java栈的本地变量表中,在Java堆中保存该引用的实例化对象,
  • 但可能并不知道,Java堆中还必须包含能查找到此对象类型数据的地址信息(如对象类型、父类、实现的接口、方法等),这些类型数据则保存在方法区中。

由于reference类型在Java虚拟机规范里面只规定了一个指向对象的引用,并没有定义这个引用应该通过哪种方式去定位,

以及访问到Java堆中的对象的具体位置,因此不同虚拟机实现的对象访问方式会有所不同

主流的访问方式有两种:使用句柄池和直接使用指针。

1,通过句柄池访问的方式如下:

2,通过直接指针访问的方式如下:

这两种对象的访问方式各有优势:

1,使用句柄访问方式的最大好处就是reference中存放的是稳定的句柄地址,
   在对象移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要修改。
2,使用直接指针访问方式的最大好处是速度快,它节省了一次指针定位的时间开销。

目前Java默认使用的HotSpot虚拟机采用的便是是第二种方式进行对象访问的。

 

posted @ 2018-03-02 13:33  假程序猿  阅读(145)  评论(0编辑  收藏  举报