jvm体系结构_JVM体系结构:JVM中的执行引擎

jvm体系结构

各位读者好! 在JVM系列的上一篇文章中,开发人员了解了虚拟机的ClassLoader和Runtime Data Areas组件。 本教程将帮助开发人员正确理解JVM中的执行引擎

1.简介

在继续之前,让我们看一下Java虚拟机及其基本特征。

1.1什么是Java虚拟机(JVM)?

Java虚拟机(JVM)是​​驻留在您的计算机上的抽象虚拟机,并为Java字节码提供了运行时环境以供执行。 JVM可用于许多硬件和软件平台,但是很少有Java开发人员知道Java运行时环境 (JRE)是Java虚拟机 (JVM)的实现。 JVM分析字节码,对其进行解释,然后执行相同的字节码以显示输出。

JVM的基本功能是执行已编译的.class文件(即字节码)并生成输出。 请注意 ,每个操作系统都有一个不同的JVM,但是在所有操作系统上生成的字节码输出都是相同的。 这意味着在Windows操作系统上生成的字节码也可以在Linux操作系统上运行,反之亦然,从而使Java成为独立于平台的语言。

图1:Java虚拟机概述

图1:Java虚拟机概述

1.1.1 JVM做什么?

Java虚拟机执行以下操作:

  • 加载所需的.class和jar文件
  • 分配参考并验证代码
  • 执行代码
  • 为Java字节码提供运行时环境

1.1.2 JVM内部架构

下图显示了符合JVM规范的Java虚拟机的关键内部组件。

图2:Java虚拟机架构

图2:Java虚拟机架构

下面分别说明图2所示的执行引擎组件。

1.2 JVM中的执行引擎

该组件执行通过类加载器分配给运行时数据区域的字节码。 该字节码作为指令读取,每个字节码指令由一个1字节的OpCode和一个加法操作数组成。 请注意 ,Java字节码是以人类可读的形式编写的,因此执行引擎必须将字节码更改为Java虚拟机中的机器可以轻松执行的语言。 执行引擎具有三个主要子组件,即

  • 解释器 :此组件读取字节码指令并以顺序方式执行它们。 该组件通过接受文件名参数从命令行运行应用程序。 可以使用以下原型命令:
    java <_compiled_file_name_without_extension_>

    请记住 ,虚拟机解释器加载的已编译类(即.class文件)必须包含采用以下形式的main()方法。

    public static void main(String[] args) { // Sample code here}
  • JIT(Just In Time)编译器 :该组件抵消了解释器执行缓慢的缺点,并提高了性能。 JIT编译器同时编译字节码的相似部分,从而减少了编译所需的总时间。 该组件中的编译器是指将JVM指令集转换为特定于OS的指令集的转换器。
    • Oracle使用称为Hotspot Compiler的编译器来搜索需要通过概要分析以最高优先级进行编译的热点,然后将该热点编译为本机代码。
  • 垃圾收集 :此组件是执行引擎的一部分,该引擎通过收集和删除未引用的对象来释放内存
图3:JVM中的执行引擎

图3:JVM中的执行引擎

1.3如何编译和执行Java类?

本节将演示Java类的编译和执行 。 让我们借助示例代码片段来了解此过程。

1.3.1创建Java文件

打开操作系统命令提示符,我们将使用“记事本”创建一个简单的Java类。 可以使用以下Java命令。

> notepad _sample_file_name_with_extension_

该命令提供以下输出。

图4:使用记事本创建Java文件

图4:使用记事本创建Java文件

1.3.2编写示例Java代码

如图4所示,该命令将打开一个记事本 ,开发人员可以将示例代码添加到显示虚拟输出的Welcome.java文件中。 示例代码如图5所示, 成功执行后将显示问候消息

图5:添加示例代码

图5:添加示例代码

1.3.3编译Java类

将代码保存在Welcome.java文件中后,开发人员将需要对其进行编译 。 该编译将生成Welcome.class文件,该文件又将生成.class文件。 要编译该文件,可以使用以下Java命令。

> javac _Java_file_name_with_extension_

该命令提供以下输出。

图6:编译文件

图6:编译文件

1.3.4执行Java类

现在,开发人员将需要执行生成的Welcome.class文件以显示输出。 要执行该文件,可以使用以下Java命令。

> java _Compiled_file_name_with_extension_

该命令提供以下输出。

图7:执行文件

图7:执行文件

1.4 JVM与JRE与JDK

在继续完成本教程之前,让我们看一下Java编程的三个重要关键字。 许多开发人员无法获得两者之间的差异。

  • Java虚拟机(JVM) :JVM是一种虚拟机,为执行Java字节码提供了运行时环境
  • Java运行时环境(JRE) :JRE是一个在其中运行JVM的环境,并具有Java虚拟机在执行时使用的类库和其他文件。 换句话说,JRE = Java虚拟机(JVM)+运行该应用程序的库
  • Java开发工具包(JDK) :JDK是JRE的父集,具有JRE包含的所有内容以及开发工具,例如编译器,调试器等。换句话说,JDK = Java运行时环境(JRE)+开发工具

这是JVM,JRE和JDK的图形表示。

图8:JVM,JRE和JDK表示形式

图8:JVM,JRE和JDK表示形式

这就是这篇文章的全部内容。 学习愉快!

2.结论

在本教程中,开发人员对JVM中的执行引擎组件进行了概述。 您可以在“ 下载”部分中下载示例代码。

3.下载源代码

这是Java虚拟机(JVM)中执行引擎的概述教程。

下载
您可以在此处下载本教程的源代码: Compilation_and_Execution

翻译自: https://www.javacodegeeks.com/2018/04/jvm-architecture-execution-engine-in-jvm.html

jvm体系结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何才能不改变图片的像素大小,只改变图片的文件大小

如图&#xff0c;有一张这样的图片&#xff0c;我们需要对它进行压缩&#xff1a; 处理前该图片的像素尺寸和文件大小如图所示&#xff1a; 接着我们使用PS打开该图片&#xff0c;如果不想改变尺寸大小&#xff0c;只改变文件大小。点击菜单【文件】->【存储为web和设备所…

java通用编码规范考试_《java编码规范考试题答案》.doc

一、单选题1. 如下关于集合类的描述错误的是 BA. 含有集合意义的属性命名&#xff0c;尽量包含其复数的意义B. 集合中的数据不需要释放&#xff0c;垃圾回收器会自动回收C. 集合必须指定模板类型D. 使用集合类时要设置初始化容量2. 关于线程以下说法错误的有BA. 新起一个线程&a…

Alfred 功能组合键/快捷键

文章目录快捷键如何设置呼出热键参考文章快捷键 快捷键说明Fn在选中的文件或者目录上点击 Fn 键可以触发其额外的操作&#xff0c;可以在【Actions】里面进行配置Command Enter可以进入当前文件所在的文件夹中Space 搜索词查找指定相关的文件&#xff0c;选中后按回车打开此…

vaadin教程_Vaadin教程

vaadin教程1.简介 当您是后端开发人员时&#xff0c;您会听到别人说您无法创建内置HTML的UI页面并且无法在CSS中设置样式而引起的痛苦。 就像成为后端开发人员一样&#xff0c;它具有已知的局限性&#xff0c;即我们可以播放和运行大型生产后端应用程序&#xff0c;但不能创建漂…

c 和java互相验签_C椭圆曲线签名 用java验签

C椭圆曲线签名 用java验签&#xff0c;java应该用什么类&#xff0c;new X509EncodedKeySpec( hex2Bytes(publicKey) ) 一直报错签名&#xff1a;294236F3FEA929A45A3544A40BE7546CCE71DD52B5B488C12C05A440440B21120C3F127FE4B53326DCE1AAE393B36EB1B57C09EF7B3230760F5C493F6…

混合多云架构_使用混合多云每个人都应避免的3个陷阱(第3部分)

混合多云架构每天都在肆意宣传云&#xff0c;但每个人都应避免三个陷阱。 从云&#xff0c;混合云到混合多云&#xff0c;您都被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程&am…

MacOS的Automator(自动操作)实用案例详解/自定义程序/自定义服务

文章目录创建新建文本文件的服务创建批量开启多个应用程序的服务创建批量开启多个应用程序的程序创建退出所有程序的服务如何删除/隐藏创建的服务删除服务隐藏服务创建新建文本文件的服务 打开 Automator 后&#xff0c;选择「快速操作」后&#xff0c;点击下方按钮「选取」&a…

用来编译java源文件的工具_基于阿里开源yugong工具类,动态编译Java源文件

适用场景&#xff1a;Java应用满足用户自定义需求场景实例代码&#xff1a;测试用例(DynamicCompileTest)package com.taobao.yugong.common;import java.io.IOException;import java.util.List;import junit.framework.Assert;import org.apache.commons.io.IOUtils;import or…

MacOS 下如何创建文本文件

文章目录通过 MacOS 自带的 Automator 创建自动化服务程序实用 Finder 扩展工具 - New File Menu通过 MacOS 自带的文本编辑程序创建通过 MacOS 自带的 Automator 创建自动化服务程序 欲知此方法请猛戳《MacOS 的 Automator 实用案例详解》 实用 Finder 扩展工具 - New File …

jdk12源代码文件_在JDK 11中启动单文件源代码程序

jdk12源代码文件JEP 330 –启动单文件源代码程序是即将发布的JDK 11&#xff08;18.9&#xff09;发行版中令人兴奋的功能之一。 此功能允许直接使用java解释器执行Java源代码。 源代码在内存中编译&#xff0c;然后由解释器执行。 限制是必须在同一文件中定义所有类。 对于刚…

java控制图片移动_多线程控制图片移动

帮忙看下为什么图片没有显示 图片目录在src 下的image 文件夹中package com.thread;import java.awt.EventQueue;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;public class SleepDemo extends JFrame implements Runnable {private JLa…

Linux 命令之 cut -- 分割字符串,显示或删除指定字段的内容,合并文件内容

文章目录一、命令介绍二、常用选项三、命令示例根据指定的字节范围显示指定文件中的内容指定字段分隔符&#xff0c;显示指定字段的内容显示指定字段的内容根据指定的字符范围显示指定文件中的内容显示指定字段以外的字段的内容以指定的输出分隔符来分割输出内容中的字段合并多…

java 抛异常 jvm_邪恶的Java技巧使JVM忘记检查异常

java 抛异常 jvm我长期以来一直在批评Java中编译器检查异常的机制。 无论您是爱还是恨&#xff0c;都可以肯定一件事&#xff1a;在某些情况下&#xff0c;您不想与他们打交道。 Java中的解决方案是将一个检查后的异常包装在new RuntimeException(e)但这可以提供较长的堆栈跟踪…

java空文本_输出到文本文件,控制台为空-Java

首先,您必须创建一个从OutputStream接口继承的类以实现适配器模式(我不确定是否是adapter)那么您可以使用该类作为波纹管主要PrintStream finalStream;TreeOutputStream tos;PrintStream out;out new PrintStream("logs.txt");tos new TreeOutputStream();tos.add(…

Linux 组合命令/命令组合的符号

在 EX 命令中&#xff0c;竖直线 | 是命令的分割符&#xff0c;它允许用户把多个命令组合在一起执行Shell 命令使用分号 ; 组合命令

混合多云架构_使用混合多云每个人都应避免的3个陷阱(第4部分)

混合多云架构每天都在肆意宣传云&#xff0c;但每个人都应避免三个陷阱。 从云&#xff0c;混合云到混合多云&#xff0c;您都被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程&…

Linux 中常见的较为复杂的命令实例

文章目录 命令 find 和命令 grep 联合使用命令 find 和 命令 convert 联合使用命令 find 和命令 rm 联合使用命令 find 和命令 xargs 联合使用命令 sed 和目录 grep 联合使用命令 find 和命令 grep 联合使用 [root@htlwk0001host test]# find . -name "*.txt" -exec…

mysql 触发器 注意事项_MySQL触发器的利弊-使用MySQL触发器时应该注意的事项

在&#xff2d;ySQL中&#xff0c;触发器可以在你执行INSERT、UPDATE或DELETE的时候&#xff0c;执行一些特定的操作。在创建触发器时&#xff0c;可以指定是在执行SQL语句之前或是之后执行这些操作。通过触发器&#xff0c;你可以实现一些业务逻辑或一些数据限制&#xff0c;在…

混合多云架构_使用混合多云每个人都应避免的3个陷阱(第2部分)

混合多云架构如果您已经完全控制了本地数据中心&#xff0c;但又不能停止利用和支付过多的资源&#xff0c;那么如何期望防止这些成本转嫁到您的云策略中呢&#xff1f; 每天都在肆意宣传云&#xff0c;但每个人都应避免三个陷阱。 从云&#xff0c;混合云到混合多云&#xff0…

Linux 系统中用于在文件内查找指定的字符串的命令 -- grep/egrep/fgrep 的区别详解

文章目录一、命令介绍grepegrepfgrep二、正则表达式元字符扩展集三、POSIX 字符集一、命令介绍 grep 一种强大的文本搜索工具&#xff0c;用于在文件内查找指定的字符串&#xff0c;在不使用转义符的前提下支持基本的正则表达式来搜索文本&#xff0c;并把匹配的行打印出来。…