编程的本质就是使用合适的算法处理特定的数据结构。
算法是指令驱动的,一条条指令按照一定的顺序执行,彼此写作,最终实现某种特定的逻辑。
Java程序的兼容性处理方式:
阶段 | 处理方式 |
---|---|
开发 | 无论在何种平台,无须为底层平台的不同做特殊处理,Java提供统一的文件访问、内存申请、线程操作、GUI开发等接口 |
编译 | 在不同平台,安装不同JDK编译 |
打包 | 通过统一命令打包 |
运行 | 只要安装了jvm就可以运行,不依赖其它dll或so |
当一门编程语言实现了完全的闭包语法策略(使用类型包装可以认为是闭包的一种),便自然具备了自动内存管理的基础。
类型是将若干属性和动作打包成一个整体对象进行识别的策略,只有实现了闭包,才能实现对象的概念。
类型为Java反射提供了基础,如果没有类型,属性可以在任意位置定义,也就难以实现反射。
面向对象机制也为垃圾回收提供了便利。
基于以上需要,以及潮流,Java被设计为面向对象的语言。
jvm内部对Java对象的表示模型是 oop-klass模型。
Hotspot虚拟机在内部使用两组类来表示Java的类和对象:
在jvm看来,不止Java类是对象,Java方法也是对象,字节码常量池也是对象,一切皆是对象。
Java的数据结构实现机制是,编译器变成字节码,运行期实现。由于要实现跨平台以及运行期类型识别,所以在编译期不支持数据结构。
对于Java类型和实例对象,jvm内部使用instanceKlass和instanceOop表示。
比如,有以下代码:
ClassA a=new ClassA();
虚拟机执行这行代码,会先将ClassA加载到perm区(jdk8中是元数据区),然后jvm在堆区中开辟一段空间,存放实例数据,然后变量a指向这个实例引用。
加载到元数据区时,便以instanceKlass形式存在,堆区中存放的就是instanceOop(也就是变量a所指向的内存区域)。
由于jvm需要保存字节码中的类元信息,所以自然而然的演化出了oop-klass这种二分模型。