《HotSpot实战》笔记2类与对象

来源:互联网 发布:js实现动态时钟 编辑:程序博客网 时间:2024/04/30 19:53

1.对象表示机制

1.1OOP-Klass二分模型


       OOP:ordinary object pointer,或OOPS。即普通对象指针,用来描述对象实例信息。

       对于OOPS对象来说,主要职责在于表示对象的实例数据,没有必要持有任何虚函数;而在Java类的Klass对象中含有VTBL,那么,Klass就能够根据Java对象的实际类型进行C++的分发,这样一来,OOPS对象只需要通过响应的Klass便可以找到所有的虚函数。

      Klass:Java类的C++对等体,用来描述Java类。

      Klass向JVM提供两个功能:

  • 实现语言层面的Java类。
  • 实现Java对象的分发功能。


1.2Oops模块


       Oops模块可以分成两个相对独立的部分:OOP框架和Klass框架。


1.3OOP框架与对象访问机制


       在java应用程序运行过程中,每创建一个Java对象,在JVM内部也会相应地创建一个OOP对象来标示Java对象。OOPS类的共同基类型为oopDesc。在HotSpot中,根据JVM内部使用的对象业务类型,具有多种oopDesc子类,每种类型的OOP都代表一个在JVM内部使用的特定对象类型。下图描述了OOPS框架的类层次结构和在JVM内部有着不同的用途。


       在虚拟机内部,通过instanceOopDesc来表示一个Java对象。对象在内存中的布局可以分为连续的两部分:instanceOopDesc和实例数据。


       显然,OOPS对象在HotSpot部会被大量地创建和频繁地使用。因此HotSpot的设计者在对OOPS设计时尽可能地进行性能和内存优化,其中一项性能优化措施就是内联。下图概括了HotSpot对象访问机制的要点:在对象引用中存放的是指针对象(instanceOop)的指针,对象本身则持有指向类(instanceKlass)的指针。


       在Java程序在JVM中运行时,有new创建的Java对象,将会在堆中分配对象实例。对象实例处理实例数据本身外,JVM还会在实例数据前面加上一个对象头。Java程序中通过对象实例的引用,可以访问到JVM内部表示的该对象,即instanceOop。当需要访问该类时,如程序需要调用对象方法或访问类变量,则可以通过instanceOop持有的类元数据指针定位到位于方法区的instanceKlass对象来完成。


1.4Klass与instanceKlass


核心数据结构Klass:

       Klass数据结构定义了所有Klass类型共享的结构和行为:描述类型自身的布局,以及刻画出与其它类间的关系。


核心数据结构InstanceKlass:

       JVM在运行时,需要一种用来标示Java内部类型的机制。在HotSpot中的解决方案是:为每一个已加载的Java类创建一个InstanceKlass,用来在JVM层表示Java类。


2.类的状态转化

         在虚拟机规范中,对Class文件格式做了详细的规定(如下图所示)。


        常量池中持有Class文件中引用的所有字符串常量、类名、接口名、字段名、方法名和其它字符信息。

        字段表用来描述接口或类中的字段。字段包括类字段或实例字段。字段表需要描述字段的如下信息:作用域(public、private、protected); static; final; volatile; transient; 类型,基本类型、对象和数组; 名称。

        属性不仅在ClassFile结构中使用,在field_info、method_info中也能见到attribute_info[]。


2.1类的状态


       虚拟机规范规定,一个Java类,首先需要从Class文件中以字节流读取出来,然后依次经过加载、链接和初始化这些逻辑阶段,才会成为JVM能够识别的格式并成为可用状态。类的加载、链接和初始化过程如下图。


2.2加载


        加载的含义是从Class文件字节流中提取类型信息。HotSpot的Classfile模块为虚拟机提供加载功能。加载实现是基于虚拟机内部提供的一个类解析工具,叫做类解析器,类解析器利用ClassFileStream读取Class文件字节流。



2.3链接



3.创建对象


       字节码new表示创建对象,虚拟机遇到该指令时,从栈顶取得目标对象的在常量池中的索引,接着定位到目标对象的类型。接下来,虚拟机将根据该类的状态,采取相应地内存分配技术,在内存中分配实例空间,并完成实例数据和对象头的初始化。这样,一个对象就在JVM中创建好了。

       实例的创建过程,首先根据从类常量池中获取对象类型信息并验证类是否已被解析过,若确保该类已被加载和正确解析,使用快速分配技术为该类分配对象空间;若该类尚未解析过,则只能通过慢速分配方式分配实例对象。实例的创建过程如下图。


《HotSpot实战》系列笔记共计4篇:

  1. 启动
  2. 类与对象
  3. 运行时数据区
  4. 垃圾收集

0 0
原创粉丝点击