jvm体系结构概述_JVM体系结构:JVM和JVM体系结构概述

jvm体系结构概述

各位读者好! 在本教程中,我们将了解和学习Java虚拟机(JVM)及其体系结构。 本教程将帮助您正确回答以下问题:

  • Java中的JVM是什么?
  • JVM的不同组件
  • JVM,JRE和JDK之间的区别

1.简介

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

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

图1:Java虚拟机概述

图1:Java虚拟机概述

1.1 JVM做什么?

Java虚拟机执行以下操作:

    • 加载所需的.class和jar文件
图2:JVM组件

图2:JVM组件

1.2 Java虚拟机的类型

Java版本具有Java虚拟机(JVM)的两种不同实现,即

  • Java Hotspot Client VM :这是JDK 2.0运行时环境的默认虚拟机,并且通过减少应用程序启动时间和内存占用量进行了调整,以在客户端环境中运行应用程序时获得最佳性能。
  • Java Hotspot Server VM :此虚拟机旨在提高程序执行速度,以便在服务器环境中运行应用程序。 通过使用服务器命令行选项来调用此虚拟机

1.3 JVM的内部架构

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

图3:Java虚拟机架构

图3:Java虚拟机架构

下面说明图3中所示的组件。

1.3.1类加载器

类加载器子系统用于加载/读取.class文件,并将字节码保存在JVM方法区域中。 该子系统执行三个主要功能,即:

  • 加载 :此组件处理类的加载
  • 链接 :此组件将验证生成的字节码并分配引用
  • 初始化 :此组件将为静态变量分配其原始值并执行静态块

1.3.2运行时数据区

该子系统分为五个主要部分,即

  • 方法区域 :此组件保存每个.class文件的类级别数据,例如元数据,常量运行时池,静态变量,方法的代码等。每个JVM只有一个方法区域,并且在所有类之间共享
  • 堆区 :此组件是JVM内存的一部分,所有对象及其对应的实例变量和数组都存储在JVM内存中。 只有一个堆区域,并且在多个线程之间共享,因为该区域中存储的数据不是线程安全的
  • 堆栈区 :该组件还是JVM内存的一部分,所有临时变量都存储在该内存中。 该区域具有堆栈帧,并为每个线程分配一个帧。 随着线程执行的完成,相应的帧也会被破坏。 堆栈区域是线程安全的,因为它不是共享资源,并且分为三个子实体,例如:
    • 局部变量数组

    该区域在方法调用和返回期间起着重要作用。

  • PC(程序计数器)寄存器 :该组件保存当前正在执行的JVM指令的地址。 Java中的每个线程都有其自己的PC寄存器,以保存当前正在执行的指令的地址
  • 本机方法堆栈 :此组件用另一种语言编写,并包含本机方法信息。 Java中的每个线程都有一个单独的本机方法堆栈

1.3.3执行引擎

该组件执行分配给运行时数据区域的字节码,并具有三个主要子组件,即:

  • 解释器 :此组件读取字节码指令并以顺序方式执行它们
  • JIT(即时)编译器 :该组件抵消了解释器执行缓慢的缺点,并提高了性能。 JIT编译器同时编译字节码的相似部分,从而减少了编译所需的总时间。 该组件中的编译器是指将JVM指令集转换为特定于OS的指令集的转换器
  • 垃圾收集 :此组件是执行引擎的一部分,该引擎通过收集和删除未引用的对象来释放内存
图4:JVM中的执行引擎

图4:JVM中的执行引擎

1.3.4本机方法接口(JNI)

该组件是一个编程框架,允许Java代码调用库或本机应用程序(即特定于系统的硬件和OS的程序)或由其调用。

1.3.5本机方法库

该组件是执行引擎所需的本机C,C ++库的集合。

1.4 JVM与JRE与JDK

JDK,JRE和JVM是Java编程的三个重要关键字,许多开发人员未能将二者区分开。

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

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

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

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

1.5如何编译和执行Java类?

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

1.5.1创建Java文件

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

> notepad _sample_file_name_with_extension_

该命令提供以下输出。

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

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

1.5.2编写示例Java代码

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

图7:添加示例代码

图7:添加示例代码

1.5.3编译Java类

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

> javac _Java_file_name_with_extension_

该命令提供以下输出。

图8:编译文件

图8:编译文件

1.5.4执行Java类

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

> java _Compiled_file_name_with_extension_

该命令提供以下输出。

图9:执行文件

图9:执行文件

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

2.结论

在本教程中,我们对Java虚拟机(JVM)及其核心组件进行了概述。 本教程可以总结为:

  • JVM是执行Java代码并通过将Java字节码转换为机器语言来产生输出的虚拟机
  • JIT编译器是JVM的子组件,用于加快性能和执行时间
  • Java的执行速度 ,原因是:
    • 动态链接

但是,新的Java Development Kit( JDK )版本在一定程度上解决了这些瓶颈性能问题。 开发人员可以在“ 下载”部分中下载示例代码片段。

3.下载源代码

这是Java虚拟机(JVM)及其核心组件的概述教程。

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

翻译自: https://www.javacodegeeks.com/2018/04/jvm-architecture-overview-of-jvm-and-jvm-architecture.html

jvm体系结构概述

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

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

相关文章

Linux 命令之 declare -- 声明或显示 shell 变量

文章目录一、命令介绍二、命令格式三、命令选项四、命令示例(一)声明变量并赋值(二)将变量设置为环境变量(三)将变量设置为只读,不可修改(四)将变量声明为整数并进行计算…

mysql数据库应用_MySQL数据库应用 从入门到精通 学习笔记

以下内容是学习《MySQL数据库应用 从入门到精通》过程中总结的一些内容提要,供以后自己复现使用。一:数据库查看所有数据库:SHOW DATABASES创建数据库:CREATE DATABSE database_name切换数据库:USE database_name删除数据库:DROP DATABASE database_name…

Linux 命令之 env -- 显示系统的环境变量,定义执行命令时的环境变量

文章目录一、命令介绍二、选项参数三、命令示例(一)显示系统的环境变量(二)从当前环境中删除指定的变量(三)定义指定的环境变量(四)在一个修改后的环境下执行命令一、命令介绍 env命…

aws lambda_跑来跑去:假人与AWS Lambda的第一次接触

aws lambda这一切始于埃及人在一个木框上滑动几块大理石以简单的算术使其大脑放松的时候。 或许是希腊人发明了Antikythera机制来追踪行星的运动至每千年2度的精度 。 无论哪种方式,计算都已经走了很长一段路:查尔斯巴贝奇的分析引擎 ,艾伦图…

Linux 命令之 set -- 显示或设置 shell 特性及 shell 变量

文章目录一、命令介绍二、选项参数三、命令示例(一)开启/关闭特性(二)将普通变量设为环境变量一、命令介绍 set 命令作用主要是显示系统中已经存在的 shell 变量,设置 shell 变量的新变量值,可以把已有的变…

Linux 命令之 unset -- 删除指定的shell变量或函数

文章目录一、命令介绍二、选项参数三、命令示例(一)删除指定的环境变量一、命令介绍 unset 为 shell 内建指令,用于删除已定义的shell变量(包括环境变量)和shell函数。unset命令不能够删除具有只读属性的shell变量和环…

带有Jersey的RESTful Web服务的JAX-RS教程

在当今世界,数据起着非常重要的作用。 如此众多的应用程序将各种类型的数据用于不同的操作,所以最重要的方面是应用程序之间的通信。 当应用程序之间可以通信时,数据共享变得容易。 就像在亚洲运行的应用程序向在欧洲运行的应用程序提供数据…

mysql --force -f_Mysql_mysql force Index 强制索引

其他强制操作,优先操作如下:mysql常用的hint对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法。同样,在mysql里,也有类似的hint功能。下面介绍一些常用的。强制索…

Linux 查看文件位置/查看文件路径的命令

which 查看可执行文件的位置find 实际搜寻硬盘查询文件名称whereis 查看文件的位置locate 配合数据库查看文件的位置

抽象工厂模式设计模式_创新设计模式:抽象工厂模式

抽象工厂模式设计模式抽象工厂模式是一种创新模式,是与构建器和工厂模式一起最受欢迎的模式之一。 使用创建模式是为了创建对象,而不是直接使用构造函数创建对象。 抽象工厂模式提供了一种封装一组具有共同主题的单个工厂而无需指定其具体类的方法。 采…

dubbo protocol port 消费者端_Dubbo源码:搞定URL,就走完了进度条的一半

Dubbo 中的 URL大家都知道,在互联网领域,每个信息资源都有统一的且在网上唯一的地址,该地址就叫 URL(Uniform Resource Locator,统一资源定位符),它是互联网的统一资源定位标志,也就…

swarm 容器_Oracle应用容器云上的WildFly Swarm

swarm 容器在此博客文章中,我将描述如何将打包在WildFly Swarmber -jar中的CloudEE Duke应用程序部署到Oracle Application Container Cloud 。 在Oracle Application Container Cloud中进行部署所需的部署工件是一个ZIP归档文件,其中包含应用程序ber-j…

mysql数据库文件还原数据库_MySql通过数据库文件恢复数据库

以表”Table”为例:如类型是MyISAM, 数据文件则以”Table.frm””Table.MYD””Table.MYI””三个文件存储于”/data/$databasename/”目录中.如类型是InnoDB, 数据文件则存储在”$innodb_data_home_dir/″中的ibdata1文件中(一般情况),结构文件存在于table_name.fr…

yum 如何知道从哪里下载包?

包来自什么地方呢?yum 如何知道从哪里下载包?起点是 /etc/yum.repos.d/ 目录,这个目录常常包含几个 repo 文件。这是 repo 的默认位置,但是可以在 YUM 配置文件(通常是 /etc/yum.conf)中指定其他位置。清单…

mysql主从修改系统参数步骤_mysql主从配置的参数配置与步骤_MySQL

mysql主从配置的参数配置与步骤_MySQL主从配置的步骤:在主库建立要同步的数据库,建立主库的帐号和修改主备库配置create database web default character set utf8grant replication slave on *.* to repdcssub192.168.191.112 identified by 123456;grant all priv…

javascript 解密_Javascript中的AES加密和Java中的解密

javascript 解密AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加容易在相同的平台&#xff0…

英文标点符号大全

标点符号英文中文名称未知反撇号’apostrophe撇号,缩写及所有格符号plus加号;正号-minus减号;负号plus or minus正负号is multiplied by乘号is divided by除号=is equal to等于号≠is not equal to不等于号≡is equivalent to全等…

Linux 系统下显示文件内容(查看文件内容)的命令 more/less/cat/head/tail 比较

命令说明more建议用于查看内容较长的文本文件,内容可以分屏显示,并且支持在显示时定位关键字cat建议用于查看内容较少的文本文件。当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因…

mysql子分区多少层_MySQL 子分区-阿里云开发者社区

介绍子分区其实是对每个分区表的每个分区进行再次分隔,目前只有RANGE和LIST分区的表可以再进行子分区,子分区只能是HASH或者KEY分区。子分区可以将原本的数据进行再次的分区划分。一、创建子分区子分区由两种创建方法,一种是不定义每个子分区…

gradle 编译java_Java的Gradle依赖关系,使用编译还是实现?

gradle 编译java当我向一位同事解释如何将Gradle用于Java项目时(他正在远离Maven ),我们遇到了各种代码示例。 一些示例将编译配置用于依赖项,而其他示例则使用Implements和api 。 dependencies { compile commons-httpclient:co…