资讯专栏INFORMATION COLUMN

Java虚拟机规范(Java虚拟机的结构)

bang590 / 894人阅读

摘要:原始类型和值虚拟机支持的原始数据类型是数字类型布尔类型和类型。,其值为位带符号的二进制补码整数,其默认值为零。

Java虚拟机的结构

本文档指定了一个抽象机器,它没有描述Java虚拟机的任何特定实现。

要正确实现Java虚拟机,你只需要能够读取类文件格式并正确执行其中指定的操作,不属于Java虚拟机规范的实现细节会不必要地限制实现者的创造力。例如,运行时数据区的内存布局、使用的垃圾收集算法、Java虚拟机指令的任何内部优化(例如,将它们转换为机器代码)由实现者自行决定。

本规范中对Unicode的所有引用都是针对Unicode标准版本11.0.0给出的,可从http://www.unicode.org/获取。

class文件格式

由Java虚拟机执行的编译代码使用独立于硬件和操作系统的二进制格式表示,通常(但不一定)存储在文件中,称为class文件格式,类文件格式精确地定义了类或接口的表示,包括可能在特定于平台的目标文件格式中被认为是理所当然的字节排序等细节。

第4章“class文件格式”详细介绍了class文件格式。

数据类型

与Java编程语言一样,Java虚拟机也可以使用两种类型:原始类型和引用类型。相应地,有两种值可以存储在变量中、作为参数传递、由方法返回,并对其进行操作:原始值和引用值。

Java虚拟机期望几乎所有类型检查都在运行时之前完成,通常由编译器完成,而不必由Java虚拟机本身完成,原始类型的值不需要被标记或以其他方式检查以在运行时确定它们的类型,或者与引用类型的值区分开来。相反,Java虚拟机的指令集使用对特定类型的值进行操作的指令来区分其操作数类型,例如,iaddladdfadddadd都是Java虚拟机指令,它们添加两个数值并产生数值结果,但每个指令都专门分别用于其操作数类型:intlongfloatdouble

Java虚拟机包含对对象的显式支持,对象是动态分配的类实例或数组,对对象的引用被视为具有Java虚拟机类型引用,类型引用的值可以被认为是指向对象的指针,一个对象可能存在多个引用,对象总是通过类型引用的值操作、传递和测试。

原始类型和值

Java虚拟机支持的原始数据类型是数字类型、布尔类型和returnAddress类型。

数字类型由整数类型和浮点类型组成。

整数类型是:

byte,其值为8位有符号二进制补码整数,其默认值为零。

short,其值为16位有符号二进制补码整数,其默认值为零。

int,其值为32位带符号的二进制补码整数,其默认值为零。

long,其值为64位带符号的二进制补码整数,其默认值为零。

char,其值为16位无符号整数,表示基本多语言平面中的Unicode代码点,使用UTF-16编码,其默认值为空代码点("u0000")。

浮点类型是:

float,其值是浮点值集的元素,或者,如果支持,则为浮点扩展指数值集,其默认值为正零。

double,其值是双精度值集的元素,或者,如果支持,则为双精度扩展指数值集,其默认值为正零。

布尔类型的值对真值truefalse进行编码,默认值为false

Java®虚拟机规范的第一版没有将布尔值视为Java虚拟机类型,但是,布尔值在Java虚拟机中的支持有限,Java®虚拟机规范的第二版通过将布尔值视为一种类型来澄清该问题。

returnAddress类型的值是指向Java虚拟机指令操作码的指针,在原始类型中,只有returnAddress类型与Java编程语言类型没有直接关联。

整数类型和值

Java虚拟机的整数类型的值是:

对于byte,从-128到127(-27到27 - 1),包括端值。

对于short,从-32768到32767(-215到215 - 1),包括端值。

对于int,从-2147483648到2147483647(-231到231 - 1),包括端值。

对于long,从-9223372036854775808到9223372036854775807(-263到263 - 1),包括端值。

对于char,从0到65535,包括端值。

浮点类型、值集和值

浮点类型是floatdouble,概念上与IEEE二进制浮点算术标准中规定的32位单精度和64位双精度格式IEEE 754值和运算相关联。

IEEE 754标准不仅包括正负号数,还包括正负零,正负无穷大,以及特殊的非数字值(以下简称为“NaN”),NaN值用于表示某些无效操作的结果,例如将零除以零。

Java虚拟机的每个实现都需要支持两个浮点值的标准集,称为浮点值集和双精度值集,此外,Java虚拟机的实现可以选择支持两个扩展指数浮点值集中的一个或两个,称为浮点扩展指数值集和双精度扩展指数值集,在某些情况下,可以使用这些扩展指数值集代替标准值集来表示floatdouble类型的值。

任何浮点值集的有限非零值都可以表示为s · m · 2(e - N + 1),其中s为+1或-1,m是小于2N的正整数,e是Emin = -(2K-1-2)和Emax = 2K-1-1之间的整数,包括端值,其中N和K是依赖于值集的参数。有些值可以用多种方式以这种形式表示,例如,假设值集中的值v可能使用s、m和e的某些值表示为此形式,那么如果m是偶数且e小于2K-1,则可以将m减半,将e增加1,以产生相同值v的第二个表示。如果m ≥ 2N-1,这种形式的表示称为标准化,否则该表示被称为非标准化,如果值集中的值不能以m ≥ 2N-1的方式表示,则该值称为非标准化值,因为它没有标准化表示。

下表中总结了对两个必需和两个可选浮点值集的参数N和K(以及派生参数Emin和Emax)的约束。

参数 浮点 浮点扩展指数 双精度 双精度扩展指数
N 24 24 53 53
K 8 ≥ 11 11 ≥ 15
Emax +127 ≥ +1023 +1023 ≥ +16383
Emin -126 ≤ -1022 -1022 ≤ -16382

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75002.html

相关文章

  • Java虚拟规范(介绍)

    摘要:此处指定的虚拟机与平台兼容,并支持语言规范中指定的编程语言。第章说明了虚拟机的指令集,按字母顺序显示操作码助记符。 介绍 一点历史 Java®编程语言是一种通用的、并发的、面向对象的语言,它的语法类似于C和C++,但它省略了许多使C和C++复杂、混乱和不安全的特性。最初开发Java平台是为了解决为联网的消费者设备构建软件的问题,它旨在支持多种主机架构,并允许安全交付软件组件,为了满足这...

    chnmagnus 评论0 收藏0
  • Java虚拟规范(目录)

    摘要:虚拟机规范介绍虚拟机介绍虚拟机的结构文件格式数据类型原始类型和值引用类型和值运行时数据区帧对象的表示浮点算术特殊方法异常指令集汇总类库公有设计,私有实现编译虚拟机格式示例使用常量局部变量和控制结构算术访问运行时常量池更多控制示例接收参数调用 Java虚拟机规范 Java SE 12 Edition 介绍 Java虚拟机介绍 Java虚拟机的结构 class文件格式 数据类型 原始类型...

    oysun 评论0 收藏0
  • Java虚拟类加载过程

    摘要:二验证验证主要是为了确保文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机的自身安全。五初始化类的初始化阶段是类加载过程的最后一步,该阶段才真正开始执行类中定义的程序代码或者说是字节码。 关注我,每天三分钟,带你轻松掌握一个Java相关知识点。 虚拟机(JVM)经常出现在我们面试中,但是工作中却很少遇到,导致很多同学没有去了解过。其实除了应付面试,作为java程序员,了解...

    lentoo 评论0 收藏0
  • 万万没想到,JVM内存结构的面试题可以问的这么难?

    摘要:方法区在实际内存空间站可以是不连续的。这一规定,可以说是给了虚拟机厂商很大的自由。但是值得注意的是,堆其实还未每一个线程单独分配了一块空间,这部分空间在分配时是线程独享的,在使用时是线程共享的。 在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了。 那么,请大家尝试着回答一下以下问题: 1、JVM管理的内存结构是怎样的? 2、不同的...

    CloudwiseAPM 评论0 收藏0
  • 从表到里学习JVM实现

    在社会化分工、软件行业细分专业化的趋势下,会真的参与到底层系统实现的人肯定是越来越少(比例上说)。真的会参与到JVM实现的人肯定是少数。 但如果您对JVM是如何实现的有兴趣、充满好奇,却苦于没有足够系统的知识去深入,那么可以参考RednaxelaFX整理的这个书单。 showImg(http://segmentfault.com/img/bVbGzn); 本豆列的脉络是:    1. JV...

    Cristic 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<