您的位置 首页 java

Java虚拟机(JVM)概述

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上执行的候选,而不考虑任何语言。

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文档

在JVM中执行Java程序

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

南昌北大青鸟青鸟南航校区

3 类加载器模块,其功能

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

首先,它加载程序类,以及以字节码形式与JDK绑定的标准Java类。标准类形成Java的核心API库。自举首先定位通常位于核心API库类的jre / lib目录。

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

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

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

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

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

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

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

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

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

文章来源:智云一二三科技

文章标题:Java虚拟机(JVM)概述

文章地址:https://www.zhihuclub.com/179057.shtml

关于作者: 智云科技

热门文章

网站地图