位于上海,服务全国!

位于上海,服务全国!

Java虚拟机(JVM)概述

作者:admin 分类: 时间:2017-01-12 16:01:21 点击量:1529

JVM(Java虚拟机)是一种抽象计算模型。 就像一款真正的机器,它有自己的指令集,执行引擎,并用于在运行时操作内存区域。 目标是为应用程序提供一个运行环境。 JVM解释指令代码并与底层交互: 用于执行指令和资源管理的OS平台和硬件架构。 本文概述了JVM以及Java程序如何在其中执行。

虚拟机
虚拟机基本上是非物理计算机,其被设计为提供特定或有时是通用目的的环境的服务。 它听起来非常类似于一个模拟器,仿真一个不存在于机器或不能根据要求执行的硬件组件。 所以,我们做的是创建软件,通过软件形式提供实际硬件提供的服务来假定特定硬件组件实际上存在于系统中。 虚拟机使用CPU虚拟化在一定程度上,提供了一个接口至真正的硬件问题。 所以,实质上,两者都提供了一个虚拟环境或一个抽象的东西。 然而,它们之间的明显差异,我们需更深的潜入。 让我们现在别关注他们的不同。 关键是,他们提出的东西,并不是他们的。 在Popek和Goldberg的“可虚拟化第三代架构的正式要求”一文中,它是“真实机器的高效,独立的副本”。

虚拟机具有由他们的需求和用途引至的类型。 一种被称为完全虚拟化,其的行为像真实机器。 其他是一些细微的,更具体的,如过程虚拟化。 很难将JVM类型化为任何特定的类型,因为JVM虚拟化了一个CPU,它有自己的运行环境和内存管理器,其与底层平台,垃圾收集器协同工作,当然,它的类库的带作为中间体字节码和最后但不是最不重要的,仿真机器寄存器,堆栈等等。 简而言之,它是Java精髓的地方,被Java编译器转换为字节码。 字节码实际上是JVM的机器码,它将重新被解释为本地机器指令。

类文件格式
有趣的是,JVM不关心Java语言或任何其他编程语言的语义和语法结构。 当涉及到执行一个程序,它的主要兴趣在于一个特定的文件格式,其被称为类文件格式。 文件格式* .class与Java代码中定义的面向对象的类结构无关。 它是一个* .java文件,由编译器转换为* .class文件。 JVM准备解释类文件;编译器使用它创建什么并不重要,只要它创建一个类文件格式。 Java编译器将程序编译为与其等效的类文件。 这些类文件实际上包含被称为字节码的半编译代码。 它被称为半编译,因为字节码不是直接可执行的,而是由C / C ++编译器创建的二进制文件。 这意味着被馈送到JVM,其进而与底层平台交互以最终执行指令。 字节码因此包含JVM指令,符号表和其他辅助信息。 编译器可以根据JVM的句法和结构约束生成字节码,而作为JVM上执行的候选,而不考虑任何语言。

用例级别3: 

JVM将自身放在字节码和底层平台之间。 平台包括操作系统(OS)和硬件。 操作系统和硬件体系结构在多个机器中可能会有所不同,但是同一个Java程序在任何其他机器上运行都不需对代码进行任何更改。 这是在虚拟环境中运行语言的独特之处。 例如,与Java相比,其他编程语言编译器(例如C ++)生成的目标代码在不同平台之间是有区别的,C ++程序需要根据平台特定的编译器重新编译,以使其兼容运行在各种架构上。 另一方面,Java代码不需要进行任何更改,因为Java编译器生成的字节码在JVM的外围执行。 因此,JVM的责任是重新解释Java编译器生成的字节码来与底层平台保持一致。 这意味着,虽然Java编译器的产品可能是与平台无关的,但JVM是平台特定的。 为一个体系结构安装和工作的同一JVM可能无法在其他机器上工作,除非当然两个机器具有相同的架构背景。

 
图形1.' JVM结构

什么是JRE和JDK,相对于JVM?
要运行Java程序,我们需要JVM,因为它是字节码执行的环境。 Oracle提供了两个产品:  JDK(Java开发工具包)和JRE(Java运行环境)。 JRE是我们安装来运行Java程序的基本软件。 它是JVM的一个实现,以及提供运行Java程序的所有方法的Java类库和其他组件部分。 所以,如果我们想运行一个类文件或字节码,JRE就够了。 另一方面,JDK(Java开发工具包)是JRE的超集。 它包含JRE提供的所有内容,包括创建类文件的工具,如Java编译器,调试器以及与开发Java程序相关的许多其他工具。 所以,如果我们想要创建一个类文件(编译Java源代码),我们需要的是JDK。 这是一个Java API文档的屏幕截图。 注意形成JDK,JRE和核心Java SE API库的组件;这给出了一个JRE和JDK的内容是什么的概念。


 图形2.' 由Java API文档


Java提供Java虚拟机规范,以获得有关JVM背后的工作原理。 大家可以从那里获得想法,并可以建立自己的JVM;尽管,这不是一个容易的任务。 市场上有很多JVM可用。 有些是免费的;有些带有商业许可证。


在JVM中执行一个Java程序
在Java运行环境上执行的每个Java程序都会创建一个JVM实例,并在其中运行。 被编译的Java类根据需要与其他依赖类一起被加载到环境中。 这是在一个被称为类装载器的模块帮助下完成的。


图形3.' 类加载器模块及其的功能

类加载器分三个阶段完成此任务。

首先,它加载程序类,以及以字节码形式与JDK绑定的标准Java类。 标准类形成Java的核心API库。 启动开始于通过定位于jre / lib中的核心API库类。

其次,扩展机制定位于外部类,例如为了开发和执行目的而添加到Java的新(可选)包。 扩展类通常位于jre/lib/ext中。 有时,扩展类位于java.ext.dirs系统属性定义的其他目录中。 这些包是JAR或ZIP扩展的形式。

第三,如果在标准Java类或扩展类中找不到该类,它将搜索CLASSPATH,其包含存储类的位置列表。 系统属性java.class.path映射到CLASSPATH环境变量。

归档文件格式(例如JAR或ZIP)是包含其他文件目录的单独文件,通常为压缩格式。 例如,程序中使用的标准类包含在随JDK一起安装的归档文件rt.jar中。

一旦文件被定位和加载,类加载器执行各种功能,例如根据JVM约束的验证,存储器分配,并且在调用构造器以设置元素的定义变量之前用默认值初始化类变量。

当加载过程完成时,字节码指令被传递给执行引擎。 JVM然后与绑定到特定平台的特殊JVM执行本地代码的帮助下与底层操作系统交互。 注意,实际实施根据平台不一样而略有不同。

数据存储区中的堆用于动态和临时存储器分配。 在此区域中创建类和数组对象。 当对象超出范围时,垃圾回收器回收内存。

Java栈被称为栈帧,用于在局部变量中存储数据;在方法的不同阶段期间调用部分结果。 每个方法调用创建一个堆栈帧。

方法区域基本上是JVM线程之间的共享存储。


寄存器是底层机器的仿真寄存器,主要用于执行字节码指令。 PC寄存器或程序计数器是用于保存当前执行指令的地址的主寄存器。

JVM的功能简介
因此,JVM的功能可以总结如下:


加载: 在类加载器的帮助下加载类的进程。
链接: 链接类以提交到JVM运行时执行。
初始化: 通过调用类初始化方法进行内存分配和值的设置。
结论
使用运行编程语言的虚拟机的最大优点是它们是平台无关的。 与诸如C / C ++的高效语言相比,由这样的语言产生的生产力胜过它们的性能折衷。 本文只是给出了JVM的一瞥,也许足以开始理解JVM是如何工作的。