JVM

来源:互联网 发布:mac用什么flash player 编辑:程序博客网 时间:2024/06/08 02:27

Java虚拟机(JVM)是一种抽象的计算机,其使得计算机运行的Java程序。JVM有三种概念:规范,实现和实例。规范是一个正式描述JVM实现所需要的文档。有一个单一的规范确保所有的实现是可互操作的。JVM实现是一个满足JVM规范要求的计算机程序。JVM的一个实例是运行在执行编译为Java字节码的计算机程序的进程中的实现。

Java Runtime Environment(JRE)是一个软件包,它包含运行Java程序所需的东西。它包括一个Java虚拟机实现和一个Java类库的实现。拥有Java商标的Oracle公司使用名为HotSpot的Java虚拟机分发Java Runtime环境。

Java开发工具包( JDK)是JRE的超集,包含用于Java程序员的工具,例如 javac编译器。Java Development Kit由Oracle Corporation直接免费提供,或由Oracle管理的 OpenJDK开源项目免费提供。
Java虚拟机是一个由规范定义的抽象(虚拟)计算机。本规范省略了确保互操作性不重要的实现细节:运行时数据区域的内存布局,使用的垃圾收集算法以及Java虚拟机指令(将其转换为机器代码)的任何内部优化。这种疏漏的主要原因是不会不必要地限制实施者。任何Java应用程序只能在Java虚拟机的抽象规范的具体实现中运行。[1]

从Java Platform Standard Edition(J2SE)5.0开始,对JVM规范的更改已在Java社区过程下作为JSR 924开发。[2]截至2006年,支持对类文件格式(JSR 202)[3]被完成为JSR 924的维护版本为JVM的规范发布的蓝皮书,[4]所述的前言中指出:

我们打算这个规范应该足够的文档Java虚拟机,使可能兼容洁净室的实现。Oracle提供了验证Java虚拟机实现的正确操作的测试。

Oracle的JVM之一被命名为HotSpot,另一个从BEA Systems继承的是JRockit。洁净室的 Java实现包括Kaffe和IBM J9。Oracle拥有Java商标,并可能允许其使用认证实现套件与Oracle规范完全兼容。

JVM字节码的组织单位之一是一个类。类加载器实现必须能够识别并加载符合Java类文件格式的任何内容。任何实现都可以自由地识别除了类文件之外的其他二进制形式,但它必须识别类文件。

类加载器按照严格的顺序执行三个基本的活动:

加载:查找并导入类型的二进制数据
链接:执行验证,准备和(可选)解决方案
验证:确保导入类型的正确性
准备:为类变量分配内存并将内存初始化为默认值
解决方法:将符号引用从类型转换为直接引用。
初始化:调用将类变量初始化为正确的初始值的Java代码。
通常,类加载器有两种类型:引导类加载器和用户定义的类加载器。

每个Java虚拟机实现都必须有一个引导类加载器,能够加载受信任的类。Java虚拟机规范没有指定类加载器应该如何定位类。
VM在原始值(整数和浮点数)和引用上运行。JVM基本上是一个32位机器。long和double64位的类型在本地被支持,但是在一个帧的本地变量或操作数堆栈中消耗两个单位的存储空间,因为每个单元是32位。boolean,byte,short,和char类型都是符号扩展(除char其是零扩展)并操作上作为32位整数,相同int类型的。较小的类型只有一些类型特定的加载,存储和类型转换指令。boolean对JVM完全不了解; 布尔byte值为8位值,0代表false1代表true。

JVM有一个垃圾回收堆,用于存储对象和数组。代码,常量和其他类数据存储在“方法区域”中。方法区域在逻辑上是堆的一部分,但实现可以将方法区域与堆分开处理,例如可能不会垃圾回收。每个JVM线程也有其自己的调用堆栈(为了清晰起见称为“Java虚拟机堆栈”),它存储了框架。每次调用某个方法时都会创建一个新的框架,并且该框架在该方法退出时被销毁。

每个框架提供一个“操作数栈”和一个“局部变量”数组。操作数堆栈用于操作数计算和接收被调用方法的返回值,而局部变量与寄存器具有相同的用途,也用于传递方法参数。因此,JVM既是堆栈机器又是注册机器。