Java虚拟机

✍ dations ◷ 2025-11-30 20:58:53 #Java规范请求,Java虚拟机,Java平台软件,跨平台软件

Java虚拟机(英语:Java Virtual Machine,缩写为JVM),一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做。最早由Sun微系统所研发并实现第一个实现版本,是Java平台的一部分,能够运行以Java语言写作的软件程序。

Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。通过对中央处理器(CPU)所执行的软件实现,实现能执行编译过的Java程序码(Applet与应用程序)。

作为一种编程语言的虚拟机,实际上不只是专用于Java语言,只要生成的编译文件符合JVM对加载编译文件格式要求,任何语言都可以由JVM编译运行。此外,除了甲骨文,也有其他开源或闭源的实现。

据技术规范所述,Java虚拟机是一部抽象(虚拟)的计算机。但技术规范未定义使用的垃圾回收算法及优化Java虚拟机指令的内部算法,这主要是为了不给实现者带来过多困扰与限制。所有的Java程序仅可在对Java虚拟机的抽象技术规范的具体实现环境中才可运行。

自Java平台标准版(J2SE)5.0起,Java虚拟机的技术规范改为由Java社区流程开发制定(JSR 924)。2006年,JSR 924对技术规范进行了变更,支持更改类文件格式(英语:class (file format))的提议(JSR 202)。Java虚拟机的技术细节以蓝皮书的形式发布,其前言称:

我们希望这份文档中的技术规范足以打造出相兼容的净室版Java虚拟机实现。甲骨文公司提供用于验证Java虚拟机实现是否正常运作的测试项目。

甲骨文公司的一款Java虚拟机名为HotSpot;另一款自BEA Systems继承而来的名为JRockit。净室设计版Java实现有Kaffe(英语:Kaffe)、IBM J9(英语:IBM J9)及Skelmir's CEE-J。甲骨文公司拥有Java商标权,且可能将其用于认证其他实现是否能完全匹配甲骨文的技术规范。

Java字节码的组织单位之一是类。类加载器实现必须识别并加载任何为Java类格式的文件。任何实现也可识别其他二进制文件,但必须识别类文件。

类加载器以下列严格顺序执行三个基础任务:

通常而言,共有两种类加载器类型:引导类加载器(Bootstrap Class Loader)及用户定义类加载器(User Defined Class Loader)。

每款Java虚拟机实现均必须有加载受信类的引导类加载器。Java虚拟机技术规范不对类加载器寻找类的方式作出指定。

Java虚拟机以原始值(整数及浮点数)及引用的方式运行,其本质上是一个32位的机器。64位的longdouble类型数据被原生支持,但需要在帧的局部变量或操作数栈中占用两个存储单元(单个单元为32位)。booleanbyteshortchar均为符号扩充类型(char使用零扩展),且以32位整数的形式(与int类型相同)运作。较小的数据类型仅有少量用于加载、存储于类型转换的特定指令。boolean类型被视为8位byte值,0代表false,1代表true。(虽然《Java虚拟机规范第二版》阐明boolean被认为是一种数据类型,但除类型特征的名字修饰及boolean数组类型外booleanbyte无太大区别。boolean类型的方法签名为Zbyte的类型签名为B。布尔型数组搭载数据类型boolean,但每个元素使用8个字节,同时Java虚拟机不内置将布尔数据包装成位数组的功能,除此之外其与byte数组大同小异。在其他用途中,Java虚拟机实际上不知道boolean类型,因为用于操作布尔型数据的指令与操作byte的指令完全相同。)

Java虚拟机拥有用于存储对象及数组的垃圾回收堆。代码、常量及其他类数据均存储于“方法区”中。方法区逻辑上是堆的一部分,但虚拟机的实现可能会区分两者,从而可能不对方法区进行垃圾回收。每个Java虚拟机线程均有其自己的调用栈(Java虚拟机栈),用于存储帧。当调用方法时,Java虚拟机将新建一个帧;方法退出时,帧将自动消除。

每帧均提供一个“操作数栈”及一个“局部变量”数组。操作数栈用于计算操作数和接收被调用方法的返回值,而局部变量与寄存器的用途相同,也用于传递方法参数。故Java虚拟机既是堆栈机器,也是寄存器机。

Java虚拟机拥有进行下列任务的指令集:

指令集存在的目的是为了保证二进制文件的兼容性。每个独立宿主操作系统需要对Java虚拟机及运行时环境的不同实现。这些Java虚拟机以相同方式语义解析字节码,但具体实现可能有所不同。比模拟字节码更复杂的是在兼容且高效的情况下实现必须映射至不同的宿主操作系统的Java核心API(英语:Java Class Library)。

上述指令集通过操作共同的抽象数据类型执行命令,而非以使用特定指令集架构的原生数据类型的方式运行。

Java虚拟机语言是指使用Java虚拟机托管的有效类文件来表示功能的任意编程语言。类文件中含有Java虚拟机指令集(Java字节码)、符号表及其他辅助信息。类文件是用于表达编译后的类及接口的二进制格式,与硬件及操作系统无关。

市面上有多种Java虚拟机语言,既有移植至Java虚拟机的旧语言,也有全新的语言。JRuby及Jython可能为最知名的移植语言之二;除此之外,也有从零编写的全新语言,如热门的Clojure、Apache Groovy、Scala及Kotlin。Java虚拟机语言的一大显著特征是都互相兼容(英语:Language interoperability),举例来说,Scala库可与Java程序互用,反之亦然。

Java 7虚拟机在Java平台上实现了《JSR 292:动态类型语言支持》。此特性由达芬奇机器(英语:Da Vinci Machine)项目开发完成,其目的旨在延伸Java虚拟机的功能,进而支持除Java外的其他语言。

由于JVM并不是专为Java所实现的运行时,实际上只要有其他编程语言的编译器能生成正确Java bytecode文件,则这个语言也能实现在JVM上运行。

以下为原生就在JVM上实现运行的语言:

以下为实现了相应的JVM编译器的语言及其编译(解释)器,意味着下列语言可以使用基于Java开发的编译器进行编译或解释:

相关

  • 机器视觉机器视觉(Machine Vision、MV)是配备有感测视觉仪器(如自动对焦相机或传感器)的检测机器,其中光学检测仪器占有比重非常高,可用于检测出各种产品的缺陷,或者用与判断并选择出物体,或
  • 多变量分析多变量统计分析(Multivariate Statistical Analysis),又称多元统计分析,简称多变量分析,为统计学的一支,常用于管理科学、社会科学和生命科学等领域中。多变量分析主要用于分析
  • 博白博白县(邮政式拼音:Pokpak),古称白州。位于中国广西壮族自治区东南部,属于玉林市。博白县也是广西肉类生产第一大、中国第十四大县市。东接广东省湛江市,南依北海市,西邻钦州市,北邻
  • 透视校正透视校正或者称为透视控制是对照片进行合成(英语:Compositing)或者编辑,以得到符合大众对于透视失真理解的结果的过程。这个校正过程包括:如果期望平行的物体直线与胶片平面不平
  • 云斑厚纹蟹云斑厚纹蟹(学名:Pachygrapsus marmoratus)是厚纹蟹属的一种螃蟹,分布于黑海、地中海和大西洋的部分地区。云斑厚纹蟹的甲壳呈方形,长2.2-3.6厘米,呈深紫褐色,有黄色的大理石纹。它
  • 得耳布尔河得耳布尔河,位于中华人民共和国内蒙古自治区东北部,是额尔古纳河右岸支流,发源于根河市得耳布尔镇东北的宁静山,蜿蜒向西南流经根河市的得耳布尔镇、五公里、耳布尔、三道桥、二
  • 釆部釆部,为汉字索引中的部首之一,康熙字典214个部首中的第一百六十五个(七划的则为第十九个)。就繁体和简体中文中,釆部归于七划部首。釆部只以左方为部字。且无其他部首可用者将部
  • 派翠克·德富林,德富林男爵派翠克·亚瑟·德富林,德富林男爵,PC(Patrick Arthur Devlin, Baron Devlin,1905年11月25日-1992年8月9日),英国法学家,曾担任英国上院大法官。是自然法学派的代表人物,主张法律可以
  • 锺皓锺皓(86年-154年),字季明,颖川郡长社县(今河南省长葛市)人。东汉名士。《后汉书》称其为锺繇祖父,裴松之注《三国志》引《先贤行状》则称其为曾祖父。锺氏是郡中大姓,家族精通律法。
  • 索菲·热尔曼索菲·热尔曼(法语:Marie-Sophie Germain,1776年4月1日-1831年6月27日),法国数学家。出身巴黎一个殷实的商人家庭,从小热爱数学,但不为家庭所鼓励。身为女性,热尔曼的故事显出了当时