0基础学习Java ——Java 虚拟机结构(上)
本帖最后由 回忆一遥远 于 2017-8-16 07:35 编辑Class 文件格式
Java 编译后的代码使用了一种平台中立的二进制格式来表示,并且经常以文件的形式存储。
Class文件格式中精确地定义了类与接口的表示形式,包括在平台相关的目标文件格 式中一些细节上的惯例。
数据类型
与 Java 程序语言中的数据类型相似, Java 虚拟机可以操作的数据类型可分为两类:
原始类型(Primitive Types)和引用类型(Reference Types)。
与之对应,也存在有原始值(Primitive Values)和引用值(Reference Values)两种类型的数值可用于变量赋值、参数传递、方法返回和运算操作。
Java 虚拟机是直接支持对象的,这里的对象可以是指动态分配的某个类的实例,也可以指某个数组的实例。虚拟机中使用reference类型来表示对某个对象的引用,reference 类型的 值读者可以想象成类似于一个指向对象的指针。每一个对象都可能存在多个指向它的引用,对象的 操作、传递和检查都通过引用它的 reference 类型的数据进行操作。
原始类型与值
Java虚拟机所支持的原始数据类型包括
数值类型(Numeric Types)
整型类型 (Integral Types)
浮点类型(Floating-Point Types)
布尔类型(Boolean Type)
returnAddress 类型
reference 是引用类型(Reference Types)的一种,而 int、long、double 等则是原始类型 (Primitive Types)的一种。
前者是具体的数据类型,后者是某种数据类型的统称。
整数类型包括:
口 byte类型:值为8位有符号二进制补码整数,默认值为零。
口 short 类型:值为16位有符号二进制补码整数,默认值为零。
口 int 类型:值为32位有符号二进制补码整数,默认值为零。
口 long类型:值为64位有符号二进制补码整数,默认值为零。
口 char 类型:值为使用16位无符号整数表示的、指向基本多文本平面(Basic Multilingual Plane, BMP)的 Unicode 值,以 UTF-16 编码,默认值为 Unicode 的 null值('\u0000')。
浮点类型包括:
口 float 类型 :值为单精度浮点数集合中的元素,或者(如果虚拟机支持的话)是单精度扩展指数(Float-Extended-Exponent)集合中的元素。默认值为正数零。
口 double类型 :取值范围是双精度浮点数集合中的元素,或者(如果虚拟机支持的话)是双精度扩展指数(Double-Extended-Exponent)集合中的元素。默认值为正数零。
口 Boolean 类型 :取值范围为布尔值true和false,默认值为false。
口 returnAddress类型:表示一条字节码指令的操作码(Opcode)。在所有的虚拟机支 持的原始类型之中,只有returnAddress类型是不能直接Java语言的数据类型对应 起来的。
NaN 是无序的,对它进行任何的数值比较和等值测试都会返回 false 的比较结果。值得一提的是,有且只有 NaN—个数与自身比较是否数值上相等时会得到 false 的比较结果,任何数字与 NaN 进行非等值比较都会返回 true 。
returnAddress 类型和值
returnAddress 类型会被 Java 虚拟机的 jsr 、ret 和 jsr_w 指令所使用。
returnAddress 类型的值指向一条虚拟机指令的操作码。
returnAddress 类型在 Java 语言之中并不存在相应的类型,也无法在程序运行期间更改 returnAddress 类型的值。
JDK7 开始,虚拟机已不允许 Class 文件内出现 jsr 、ret 、jsr_w 这几条指令。因此 returnAddress 类型就处于名存实亡的状态。
boolean 类型
虽然 Java 虚拟机定义了 Boolean 这种数据类型,但是对它提供的支持非常有限。
在 Java 虚拟机中没有任何供 Boolean 值专用的字节码指令,因此在 Java 语言中涉及到 boolean 类型值的运算,在编译之后都使用 Java 虚拟机中的 int 数据类型来代替。
Java 虚拟机直接支持 Boolean 类型的数组,虚拟机的 newarray 指令可以创建这种数组
引用类型与值
Java虚拟机中有三种引用类型:
类类型(Class Types)
数组类型(Array Types)
接口类型(Interface Types)
这些引用类型的值分别由类实例、数组实例和实现了某个接口的类实例或数组实例动态创建。
数组类型还包含一个单一维度(即长度不由其类型决定)的组件类型(Component Type), —个数组的组件类型也可以是数组。但从任意一个数组开始,如果发现其组件类型也是数组类型的话,继续重复取这个数组的组件类型,这样操作不断执行,最终一定可以遇到组件类型不是数组的情况,这时就把这种类型成为数组类型的元素类型(Element Type)。数组的元素类型必须是原始类型、类类型或者接口类型之中的一种。
引用类型的值中有一个特殊的值:null,当一个引用不指向任何对象的时候,它的值就用null来表示。
Java 虚拟机规范并没有规定 null 在虚拟机实现中应当怎样编码表示。
运行时数据区
Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区。。
一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。
一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。
页:
[1]