《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篇:
- 启动
- 类与对象
- 运行时数据区
- 垃圾收集
- 《HotSpot实战》笔记2类与对象
- 《HotSpot实战》笔记1启动
- 【笔记】HotSpot虚拟机对象探秘
- 《HotSpot实战》笔记4垃圾收集
- JVM学习(2)-HotSpot对象
- 与HotSpot虚拟机对象有关的问题
- Java内存区域与HotSpot虚拟机对象
- 《HotSpot实战》笔记3运行时数据区
- JVM学习笔记(二)HotSpot虚拟机对象探秘
- JVM笔记(二)——HotSpot虚拟机对象
- HotSpot虚拟机对象探秘
- HotSpot虚拟机对象探秘
- HotSpot虚拟机对象探秘
- Hotspot虚拟机对象探秘
- JVM虚拟机-对象(HotSpot)
- HotSpot虚拟机对象
- HotSpot虚拟机对象
- HotSpot虚拟机对象探讨
- 运放中不使用引脚正确处理方式
- 豁达是一种人生智慧
- CSU 1407: 最短距离(数学啊 )
- 【HDU 1158】 Employment Plannin
- 灰度世界算法(Gray World Algorithm)
- 《HotSpot实战》笔记2类与对象
- C语言基础之数组、字符串、指针
- 编程学习笔记3--大整数的运算
- android中string.xml中%1$s、%1$d等的用法
- CSU 1408: 种植树苗(贪心啊 )
- HDU2734:Quicksum
- android 下 对3G 模块进行AT 命令调试
- 谈下自己,我比较精通J2SE,熟悉J2SE里的Servlet等
- 20个最热门的IT技术职位及薪资