Java虚拟机(十)--面向对象、oop-klass模型

	编程的本质就是使用合适的算法处理特定的数据结构。
	算法是指令驱动的,一条条指令按照一定的顺序执行,彼此写作,最终实现某种特定的逻辑。

Java程序的兼容性处理方式:

阶段 处理方式
开发 无论在何种平台,无须为底层平台的不同做特殊处理,Java提供统一的文件访问、内存申请、线程操作、GUI开发等接口
编译 在不同平台,安装不同JDK编译
打包 通过统一命令打包
运行 只要安装了jvm就可以运行,不依赖其它dll或so
当一门编程语言实现了完全的闭包语法策略(使用类型包装可以认为是闭包的一种),便自然具备了自动内存管理的基础。

类型是将若干属性和动作打包成一个整体对象进行识别的策略,只有实现了闭包,才能实现对象的概念。

类型为Java反射提供了基础,如果没有类型,属性可以在任意位置定义,也就难以实现反射。

面向对象机制也为垃圾回收提供了便利。

基于以上需要,以及潮流,Java被设计为面向对象的语言。


jvm内部对Java对象的表示模型是 oop-klass模型。

Hotspot虚拟机在内部使用两组类来表示Java的类和对象:

  • oop,用来描述类的实例信息
  • klass,用来描述Java类,是jvm内部Java类型结构的对等体

在jvm看来,不止Java类是对象,Java方法也是对象,字节码常量池也是对象,一切皆是对象。
Java的数据结构实现机制是,编译器变成字节码,运行期实现。由于要实现跨平台以及运行期类型识别,所以在编译期不支持数据结构。

对于Java类型和实例对象,jvm内部使用instanceKlass和instanceOop表示。

比如,有以下代码:

ClassA a=new ClassA();

虚拟机执行这行代码,会先将ClassA加载到perm区(jdk8中是元数据区),然后jvm在堆区中开辟一段空间,存放实例数据,然后变量a指向这个实例引用。
加载到元数据区时,便以instanceKlass形式存在,堆区中存放的就是instanceOop(也就是变量a所指向的内存区域)。

而所有的oop对象,都继承自oopDesc(jdk 8有变化,但意思一样),oopDesc中有2个关键变量_mark和_metadata。
_mark中存放的有线程状态,并发锁,GC分代信息等内存标识。
_metadata存放的是指向这个类的instanceklass的地址。

由于jvm需要保存字节码中的类元信息,所以自然而然的演化出了oop-klass这种二分模型。

猜你喜欢

转载自blog.csdn.net/ljz2016/article/details/82917535