鱼C论坛

 找回密码
 立即注册
查看: 2757|回复: 0

[学习笔记] 0基础学习Java ——Java 虚拟机结构(上)

[复制链接]
发表于 2017-8-15 14:57:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 回忆一遥远 于 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鱼币 +5 收起 理由
小甲鱼 + 5

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 01:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表