Java虚拟机
编辑Java虚拟机(JVM)是一种虚拟机,使计算机运行的Java程序,以及写在程序的其他语言,它们也编译成Java字节码。通过规范详细描述了JVM,该规范正式描述了JVM实现中的要求。有了规范,可以确保Java程序在不同实现中的互操作性,因此使用Java开发工具包(JDK)的程序作者不必担心基础硬件平台的特性。
Java虚拟机参考实现由OpenJDK项目作为开放源代码开发,并包括一个称为HotSpot的JIT编译器。Oracle Corporation提供的商业支持的Java版本基于OpenJDK运行时。Eclipse OpenJ9是OpenJDK的另一个开源JVM。
Java虚拟机规范
编辑Java虚拟机是由规范定义的抽象(虚拟)计算机。没有指定使用的垃圾收集算法以及Java虚拟机指令的任何内部优化(将其翻译成机器代码)。忽略的主要原因是不要不必要地限制实施者。任何Java应用程序都只能在Java虚拟机抽象规范的某些具体实现中运行。
从Java Platform Standard Edition(J2SE)5.0开始,在Java Community Process下开发了对JVM规范的更改,称为JSR924。从2006年开始,对规范的更改以支持对类文件格式(JSR)提出的更改。被完成为JSR 924的维护版本为JVM的规范发布的蓝皮书,所述的前言中指出:
我们希望该规范应充分记录Java虚拟机,以使兼容的洁净室实现成为可能。Oracle提供的测试可以验证Java虚拟机实现的正确运行。
Oracle的Java虚拟机之一名为HotSpot,而从BEA Systems继承的另一个JVM为JRockit。洁净室Java实现包括Kaffe,OpenJ9和Skelmir的CEE-J。Oracle拥有Java商标,并且可以允许其用于证明实施套件与Oracle规范完全兼容。
类加载器
类是Java虚拟机字节码的组织单位之一。类加载器的实现必须能够识别并加载符合Java类文件格式的任何内容。任何实现都可以自由识别除类文件之外的其他二进制形式,但必须识别类文件。
类加载器按此严格顺序执行三个基本活动:
- 加载:查找并导入类型的二进制数据
- 链接:执行验证,准备和(可选)解析
- 验证:确保导入类型的正确性
- 准备:为类变量分配内存并将内存初始化为默认值
- 解决:将符号引用从类型转换为直接引用。
- 初始化:调用将类变量初始化为其正确起始值的Java代码。
通常,类加载器有两种类型:引导类加载器和用户定义的类加载器。
每个Java虚拟机实现都必须具有一个引导类加载器,该加载器能够加载受信任的类。Java虚拟机规范未指定类加载器应如何定位类。
虚拟机架构
Java虚拟机对原始值(整数和浮点数)和引用进行操作。JVM基本上是32位计算机。本机支持64位long
和double
类型的类型,但是它们消耗帧的局部变量或操作数堆栈中的两个存储单元,因为每个单元都是32位。boolean、
byte、
short
和char
类型都是符号扩展(除char
其是零扩展)和作为32位整数,相同操作int
的类型。较小的类型仅具有一些特定于类型的指令,用于加载、存储和类型转换。boolean
以8位byte
值操作,0代表false
1代表true
。(虽然boolean
一直被当成因为类型的Java虚拟机规范,第二版澄清了这个问题,在编译和执行的代码是有区别不大boolean
并且byte
除了名字改编的方法签名和布尔阵列的类型。boolean
S IN方法签名错位作为Z
而byte
s的错位如B
布尔阵列携带型boolean[]
,但每个元件使用8位,Java虚拟机已经没有内置的能力收拾布尔值到一个位阵列,因此除了他们执行和行为的类型与byte
数组相同。在所有其他用途中,boolean
JVM实际上不知道type类型,因为所有对布尔值进行操作的指令也都用于对byte
s进行操作。)
Java虚拟机具有用于收集对象和数组的垃圾回收堆。代码、常量和其他类别数据存储在“方法区域”中。方法区域在逻辑上是堆的一部分,但是实现可以将方法区域与堆分开对待,例如,可能不会对其进行垃圾回收。每个JVM线程还具有自己的调用堆栈(为清楚起见,称为“ Java虚拟机堆栈”),该堆栈存储框架。每次调用方法时都会创建一个新框架,并且该方法退出时该框架将被销毁。
每个框架提供一个“操作数堆栈”和一个“局部变量”数组。操作数栈用于计算操作数和接收被调用方法的返回值,而局部变量的作用与寄存器相同,还用于传递方法参数。因此,Java虚拟机既是堆栈机又是寄存器机。
字节码指令
Java虚拟机具有以下任务组的说明:
- 加载和存储
- 算术
- 类型转换
- 对象创建和操作
- 操作数堆栈管理(推/弹出)
- 控制转移(分支)
- 方法调用和返回
- 抛出异常
- 基于xxx器的并发
目的是二进制兼容性。每个特定的主机操作系统都需要自己的JVM和运行时实现。这些JVM在语义上以相同的方式解释字节码,但实际实现可能有所不同。与模拟字节码相比,更复杂的方法是兼容且有效地实现必须映射到每个主机操作系统的Java核心API。
这些说明在一组通用的上进行操作 抽象的数据类型而不是任何特定指令集体系结构的本地数据类型。
Java虚拟机语言
JVM语言是具有可以用Java虚拟机可以承载的有效类文件表示的功能的任何语言。一个类文件包含Java虚拟机指令(Java字节码)和一个符号表,以及其他辅助信息。类文件格式是独立于硬件和操作系统的二进制格式,用于表示已编译的类和接口。
有几种JVM语言,既有移植到JVM的旧语言又有全新的语言。JRuby和Jython可能是现有语言中最著名的端口,分别是Ruby和Python。在从头创建到Java字节码的新语言中,Clojure,Apache Groovy,Scala和Kotlin可能是最受欢迎的语言。JVM语言的一个显着特征是它们彼此兼容,例如,Scala库可以与Java程序一起使用,反之亦然。
Java 7 JVM在Java平台上实现了JSR 292:支持动态类型语言,这是一项新功能,它支持JVM中的动态类型语言。该功能是在达芬奇机器项目中开发的,其目的是扩展Java虚拟机,使其支持Java以外的语言。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/116409/