JVM 工作原理和即时编译(JIT)

news2024/11/28 16:47:28

目录

1、什么是虚拟机?

2、JVM 虚拟机简介

3、JVM 的工作原理

4、什么是即时编译(JIT)?

5、解释型语言和编译型语言的区别

6、为什么说 Java 是一种半编译半解释的语言?


1、什么是虚拟机?

        虚拟机是一种运行在操作系统之上的软件程序,它模拟了一台计算机的硬件环境和操作系统功能,从而可以在其上运行应用程序。虚拟机的本质是在硬件层面和操作系统层面之上添加了一个抽象层,通过这个抽象层,应用程序可以直接在虚拟机上运行,而不需要关心底层硬件和操作系统的细节。

        虚拟机有多种类型,包括:

  1. 操作系统级虚拟化:通过虚拟化技术将一台物理计算机分割成多个虚拟的计算机,每个虚拟计算机都运行着自己的操作系统和应用程序,互不干扰。
  2. 应用程序虚拟机:它是一种特殊的虚拟机,用于运行特定类型的应用程序,如 Java 虚拟机(JVM)用于运行 Java 应用程序,.NET 虚拟机用于运行 .NET 应用程序。
  3. 模拟器:它可以模拟一台完整的计算机系统,包括硬件和操作系统,可以运行任何类型的应用程序。

        虚拟机的优点在于它可以实现跨平台和隔离性。跨平台是指应用程序可以在不同的操作系统和硬件平台上运行,而不需要重新编写或修改代码;隔离性是指虚拟机可以将应用程序隔离开来,从而提高应用程序的安全性和可靠性。虚拟机在云计算、虚拟化和容器化等领域都得到广泛的应用。

2、JVM 虚拟机简介

        JVM(Java Virtual Machine,Java 虚拟机)是一个能够运行 Java 字节码的虚拟机,它是 Java 平台的核心组件之一。JVM 是跨平台的,可以在不同的操作系统上运行相同的 Java 应用程序,因为它提供了一个统一的运行环境。在运行 Java 应用程序时,首先需要将 Java 源代码编译成字节码,然后将字节码交给 JVM 执行。

        JVM 主要由三部分组成:类加载器、运行时数据区和执行引擎。// JVM学习蓝图

        (1)类加载器

        类加载器是 JVM 的一个重要组成部分,它的主要作用是将字节码加载到 JVM 中并生成对应的类。类加载器按照层次结构进行组织,每个类加载器都有一个父类加载器,最顶层的类加载器是引导类加载器(Bootstrap ClassLoader),它是用本地代码实现的,主要负责加载 Java 核心类库。其他类加载器包括扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。// 双亲委派机制

        (2)运行时数据区

        运行时数据区是 JVM 运行时的内存区域,它包括以下几个部分:

  • 程序计数器(Program Counter Register):保存了当前线程执行的字节码指令地址。
  • Java 虚拟机栈(Java Virtual Machine Stacks):保存了线程执行方法的局部变量表、操作数栈、动态链接、方法出口等信息。
  • 本地方法栈(Native Method Stack):保存了本地方法执行的信息。
  • Java 堆(Java Heap):保存了对象实例和数组等动态分配的内存。

        (3)执行引擎

        执行引擎是 JVM 的核心组件之一,它的主要作用是执行字节码指令。执行引擎包括解释器和即时编译器(Just-In-Time Compiler,JIT)。解释器是将字节码指令解释为机器码逐条执行的方式,执行速度较慢;而 JIT 编译器是将字节码指令编译为本地机器码后再执行,执行速度更快。

        JVM 还包括垃圾回收器、安全性管理器等组件,它们都是 JVM 的重要组成部分。JVM 为 Java 提供了跨平台、安全、高效的运行环境,是 Java 平台的核心技术之一。

3、JVM 的工作原理

       JVM(Java虚拟机)是Java应用程序的运行环境,它的主要任务是将Java字节码解释或编译成机器指令,然后在计算机上运行。JVM的工作原理可以分为三个步骤:加载、解释/编译和执行

  1. 加载:当Java应用程序启动时,JVM会加载应用程序所需的类和资源文件。类加载器会从本地文件系统、网络或其他位置加载类文件,然后将类文件存储在JVM的内存中。加载过程包括三个步骤:加载、连接和初始化加载是指从磁盘读取字节码文件并将其存储在内存中;连接包括验证、准备和解析三个步骤,验证是确保字节码文件符合Java虚拟机规范的过程,准备是为类的静态变量分配内存并设置初始值,解析是将符号引用转换成直接引用的过程;初始化是为静态变量赋予正确的初始值,以及执行静态代码块中的语句。

  2. 解释/编译:JVM将Java字节码解释成机器指令,然后交给计算机处理。在解释过程中,JVM会逐条执行字节码指令,将其转换成机器指令,并将结果存储在堆栈中。解释是一种解释执行方式,速度较慢。JVM还可以使用即时编译(JIT)技术将字节码编译成本地代码,然后执行本地代码。编译可以提高程序的执行速度。

  3. 执行:执行是指将机器指令交给计算机处理的过程,计算机根据指令执行相应的操作。执行过程中,JVM会管理内存、线程、异常等方面的问题,以确保应用程序正常运行。

        总的来说,JVM的工作原理是将Java字节码加载到内存中,然后解释或编译成机器指令,最后交给计算机处理。JVM还负责管理内存、线程和异常等问题,以确保Java应用程序的正常运行。

        // 弄懂了JVM工作原理的每个详细步骤,也就弄懂了JVM虚拟机,后续的学习过程,无非就是解剖每个过程中的细节。

4、什么是即时编译(JIT)?

        即时编译(Just-In-Time Compilation,JIT)是一种在程序运行时动态编译字节码为机器码的技术,可以显著提高 Java 程序的性能。下面对 JIT 技术进行详细解释:

        Java 程序运行的基本流程:Java 程序是先编译成字节码文件(.class 文件),再由 Java 虚拟机(JVM)将字节码转换为机器码进行执行。在 Java 程序运行时,JVM 会将字节码文件加载到内存中,然后对字节码进行解释执行。

        JIT 技术的作用:在解释执行字节码的过程中,由于每条指令都需要解释执行一遍,导致程序的运行效率比较低。而 JIT 技术可以在程序运行时,将经常被执行的字节码动态编译成机器码,再直接执行机器码,避免了反复解释执行的过程,从而提高了程序的运行效率

        JIT 技术的实现原理 JIT 技术的实现原理可以简单地概括为以下几个步骤:

  1. 首先,JVM 在程序运行时,会动态地收集程序的运行数据,例如哪些方法被调用频繁、哪些代码块经常被执行等等。
  2. 然后,JIT 技术会根据收集到的运行数据,对字节码进行分析和优化,将其中的热点代码(HotSpot)编译成机器码。
  3. 最后,JVM 将编译好的机器码保存到缓存中,以备下次使用。这样,下次运行时,就可以直接执行编译好的机器码,避免了反复解释执行的过程。

        JIT 技术的优缺点:JIT 技术的主要优点是能够显著提高 Java 程序的性能,尤其是对于那些执行时间长、循环次数多的代码,优化效果更为明显。但是,JIT 技术也存在一些缺点,例如:

  1. JIT 技术需要消耗一定的内存空间来保存编译好的机器码,而且由于程序运行时动态编译的特性,可能会导致一些初始的性能损失。
  2. JIT 技术对于一些特殊的代码(例如反射、动态生成代码等)可能无法进行有效的优化,从而导致性能下降。

5、解释型语言和编译型语言的区别

        解释型语言和编译型语言的主要区别在于它们如何执行代码

        编译型语言(如 C、C++、Java 等)将源代码转换为可执行代码的过程称为编译。编译器将源代码翻译成目标代码(二进制代码),并在运行之前将其编译成机器码。一旦编译完成,就可以直接运行目标代码,而无需重新编译。编译型语言的优点是速度快,因为在运行时不需要进行翻译或解释,但是需要对不同的平台进行重新编译,因此不够灵活。// 一次编译到处运行

        解释型语言(如 Python、Ruby、JavaScript 等)则不需要编译器将代码转换为机器码。它们会逐行解释代码并在运行时进行翻译。解释型语言的优点是更具灵活性,因为它们可以在运行时对代码进行修改,但是执行速度通常比编译型语言慢,因为需要每次都进行翻译。// 一边解释一边执行

        当然,还有一些语言是半编译半解释型语言,如 Java。它们使用编译器将源代码编译成字节码,然后使用解释器将字节码转换为机器码。这种机制使得 Java 应用程序具有高度的可移植性和跨平台性,同时也具有较高的执行效率。

6、为什么说 Java 是一种半编译半解释的语言?

        Java 是一种半编译半解释的语言,它的编译器将 Java 代码编译成 Java 字节码,而不是机器码。Java 字节码是一种中间语言,可以在 Java 虚拟机(JVM)上运行。

        在 Java 程序执行之前,Java 编译器将 Java 代码编译成字节码,并将其保存在 .class 文件中。这个过程被称为编译。当 Java 程序运行时,JVM 将字节码加载到内存中,并将其转换为机器码,这个过程被称为解释。// Java文件->字节码文件->机器码

        Java 的半编译半解释的特性使得 Java 具有跨平台性。由于 Java 程序不会直接编译成机器码,而是编译成中间代码,因此 Java 应用程序可以在任何平台上运行,只要该平台上有一个能够解释 Java 字节码的 JVM。这种机制使得 Java 应用程序具有高度的可移植性和跨平台性。

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

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

相关文章

直播美颜技术的演进及其应用:直播美颜SDK详解

直播美颜技术的应用,为直播开辟了新的业态,从最初简单的美颜滤镜,到现在的直播美颜SDK,其技术演进历程也是一步步走来。 一、直播美颜技术的演进 1、简单美颜滤镜 最初的直播美颜技术,就是通过简单的美颜滤镜来实现…

python内存回收gc模块

目录1. python 垃圾回收机制标记-清除的回收机制分代回收2. gc 模块参考资料对已经销毁的对象,Python不会自动释放其占据的内存空间。为了能够充分地利用分配的内存,避免程序跑到一半停止,要时不时地进行内存回收,这时候gc&#x…

超详细——Python中 pip 常用命令

人生苦短,我学Python 相信对于大多数熟悉Python的人来说,一定都听说并且使用过pip这个工具,但是对它的了解可能还不一定是非常的透彻,今天小编就来为大家介绍10个使用pip的小技巧,相信对大家以后管理和使用Python当中…

每天一道大厂SQL题【Day19】华泰证券真题实战(一)

每天一道大厂SQL题【Day19】华泰证券真题实战(一) 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&…

CSS中相对定位与绝对定位的区别及作用

CSS中相对定位与绝对定位的区别及作用场景复现核心干货相对定位绝对定位子绝父相🔥🔥定位总结绝对定位与相对定位的区别场景复现 在学习前端开发的过程中,熟练掌握页面布局和定位是非常重要的,因此近期计划出一个专栏&#xff0c…

【问题、AI解答】mongodb中使用$lookup进行连表查询使用_id作为localField出现查询结果字段为空的情况

描述: db.acticles.aggregate([ {$lookup:{from:"acticlesMaptags",localField:"_id",foreignField:"acticleid",as:"tagid"} } ])acticlesMaptags集合中的acticleid字段存在与acticles集合中的_id相匹配的数据…

1.15 从0开始学习Unity游戏开发--游戏UI

上一章中,我们剩下最后一个任务,需要支持鼠标控制准心来进行设计,那么准心本质上就是一个始终呈现在屏幕上的一个图片,你当然可以用一个3D物体来制作,之前讲解渲染概念的时候也提到过,我们的屏幕就是相机的…

传智健康_day3

本章对检查组管理进行开发 一.新增检查组 1.修改新增弹层可见属性&#xff0c;添加重置表单功能 2.动态刷新检查组包含的检查项信息 <tr v-for"c in tableData"> 使用for循环来遍历查询出tableData中的数据 tableData是一个数组对象&#xff0c;定义在VUE…

hadoop分布式安装

文章目录1. 将安装包hadoop-3.1.3.tar.gz上次至linux中2. 进行解压操作3. 修改目录名称4. 配置环境变量5. 远程传输5.1 scp远程传输6. 免密登录7. 集群规划8. 修改自定义配置文件8.1 hadoop-env.sh8.2 core-site.xml8.3 hdfs-site.xml8.4 mapred-site.xml8.5 yarn-site.xml8.6 …

ReactNative入门

React基本用法&#xff1a; react与js不同的点在于 react使用的是虚拟DOM js是真实DOM 作用&#xff1a;当有新的数据填充 可以复用之前的&#xff0c;而js需要整体重新渲染 创建虚拟DOM还可以使用jsx语法直接声明&#xff1a; 注意要用babel标签将jsx转化为js 但是建议采用j…

UNIX环境高级编程——进程环境

7.1 引言 本章主要讲解了进程的环境。 7.2 main函数 C程序总是从main函数开始执行&#xff0c;其函数原型为&#xff1a; int main(int argc, char *argv[]);argc是命令行参数的数目&#xff0c;argv是指向参数的各个指针所构成的数组&#xff1b;当内核执行C程序时&#x…

SpringBoot集成Kafka详解

一、使用idea创建SpringBoot项目 1.1 使用Spring Initializr创建一个SpringBoot程序 点击Next。 1.2 添加依赖 依赖说明&#xff1a; Lombok简化实体类开发。 Spring Web让项目集成web开发所有依赖&#xff0c;包括Spring MVC&#xff0c;内置tomcat等。 Spring for Apache…

HNU-操作系统OS-2023期中考试复习-刷题

往年期中卷极难获得&#xff0c;这里找了几套卷子。可以看看。 因为往年都是从第一周开始上课的&#xff0c;所以进度会快一点&#xff0c;这学期是从第四周开始上课的&#xff0c;所以进程会慢些&#xff0c;讲到第九章所以只考到第九章。 同样因为太忙了&#xff0c;答案找…

图像分类卷积神经网络模型综述

图像分类卷积神经网络模型综述遇到问题 图像分类&#xff1a;核心任务是从给定的分类集合中给图像分配一个标签任务。 输入&#xff1a;图片 输出&#xff1a;类别。 数据集MNIST数据集 MNIST数据集是用来识别手写数字&#xff0c;由0~9共10类别组成。 从MNIST数据集的SD-1和…

ctfshow web入门web119-124

1.web119 和118题类似&#xff0c;只不过是过滤了PATH 0可以用任何字符代替&#xff0c;比如A,{A},A,{0} KaTeX parse error: Expected }, got # at position 2: {#̲SHLVL}1&#xff0c;或者{##},${#?} {PHP_VERSION:~A}2,php版本为x.x.2时 ${#IFS}3(linux下是3&#xff0c;…

IntelliJ IDEA 2023.1正式发布,Maven项目大提速支持Apache Dubbo

你好&#xff0c;我是YourBatman&#xff1a;做爱做之事❣交配交之人。 &#x1f4da;前言 一年一个大版本&#xff0c;共计3个中型版本&#xff0c;北京时间2023年3月月29日终于迎来了IntelliJ IDEA今年的首个版本2023.1。老规矩&#xff0c;吃肉之前&#xff0c;可以先把这…

顺丰科技x腾讯安全iOA联合案例获云安全联盟CSA 2022安全革新奖

近年来&#xff0c;随着云计算、大数据、物联网等技术的加速创新和应用&#xff0c;一场数字化的变革开始席卷各行各业。远程办公、业务协同、分支互联等需求涌现&#xff0c;随之而来的还有更加复杂多元的高级网络攻击。在此背景下&#xff0c;传统的基于边界的网络安全防护理…

矩阵键盘+CH559制作国产USB矩阵键盘

矩阵键盘+CH559制作国产USB矩阵键盘 文章目录 矩阵键盘+CH559制作国产USB矩阵键盘为什么选择CH559作为主控芯片?如何实现该款矩阵USB键盘?如何将矩阵键盘的信号转化为USB键盘信号?原材料: 矩阵键盘(附带行列键码定义)CH559开发板将矩阵键盘的所有排线连接到单片机的GPIO引…

基于stm32mp157 linux开发板ARM裸机开发教程5:ARM微处理器指令系统(连载中)

前言&#xff1a; 目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中&#xff0c;使其内容更加丰富&#xff0c;讲解更加细致&#xff0c;全文所使用的开发平台均为华清远见FS-MP1A开发板&#xff08;STM32MP157开发板&#xff09; 针对对FS-MP1A开发板&…

Python | Python的自我介绍(前世今生)

本文概要 本篇文章主要介绍Python这门语言的前世今生&#xff0c;适合刚入门的小白或者想了解Python历史的同学&#xff0c;文中描述很详细&#xff0c;具有一定的学习价值&#xff0c;感兴趣的小伙伴快来一起学习吧。 个人简介 ☀️大家好&#xff01;我是新人小白博主朦胧的…