JVM:字节码

news2024/11/17 23:58:53

JVM:字节码

  • 前言
  • 1. JVM概述
    • 1.1 JVM vs JDK vs JRE
      • 1.1.1 JVM
      • 1.1.2 JDK
        • 1.1.2.1 常用的JDK8是Oracle JDK 还是 OpenJDK
      • 1.1.3 JRE
      • 1.1.4 三者之间的关系与区别
    • 1.2 什么是字节码?采用字节码的好处是什么?
    • 1.3 Java 程序从源代码到运行的过程
    • 1.4 JVM的生命周期
    • 1.5 JVM架构图
  • 2. 字节码
    • 2.1 字节码文件是跨平台的吗?
    • 2.2 class文件里面是什么?
  • 3. 解释器与JIT编译器

前言

请添加图片描述

1. JVM概述

1.1 JVM vs JDK vs JRE

1.1.1 JVM

Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
JVM 并不是只有一种!只要满足 JVM 规范,每个公司、组织或者个人都可以开发自己的专属 JVM。 也就是说我们平时接触到的 HotSpot VM 仅仅是是 JVM 规范的一种实现而已。除了我们平时最常用的 HotSpot VM 外,还有 J9 VM、Zing VM、JRockit VM 等 JVM 。

1.1.2 JDK

JDK(Java 开发工具包):JDK 是 Java 程序的开发环境,它包含了用于开发、编译和调试 Java 程序所需的工具和库。JDK 包括了 JRE 和一系列开发工具,如编译器(javac)、调试器(jdb)、JavaDoc 工具等。JDK 还提供了 Java 标准库和其他开发所需的类库。

1.1.2.1 常用的JDK8是Oracle JDK 还是 OpenJDK

在 JDK 8 的时代,Oracle JDK 和 OpenJDK 都是常见的选择。一般来说,Oracle JDK 8 是比较常用的版本,因为它在 JDK 8 发布时是主要的 JDK 提供商 。Oracle JDK 8 在商业环境中提供了长期支持,同时还包含了一些额外的闭源组件。

然而,自 JDK 11 开始,Oracle 将其 JDK 的开发重点转向了 OpenJDK,并且 Oracle JDK 11 及以后的版本使用 GPL 许可协议,与 OpenJDK 保持一致。这意味着从 JDK 11 开始,OpenJDK 成为了更广泛使用的选择,因为它是免费的、开源的,并且由广大的开源社区支持。

总的来说,对于 JDK 8,Oracle JDK 是常见的选择,但对于更高版本的 JDK,OpenJDK 更为普遍。

1.1.3 JRE

JRE(Java 运行时环境):JRE 是 Java 程序的运行环境,它是 JVM 的一部分。JRE 包含了 JVM 和 Java 类库,用于执行已编译的 Java 程序。它提供了 Java 应用程序所需的运行时支持,包括线程管理、I/O、网络通信等功能。对于只需要运行 Java 程序的用户来说,安装 JRE 即可。

1.1.4 三者之间的关系与区别

  • JDK 包含了 JRE,JDK 是开发环境,提供了编译器和其他开发工具,而 JRE 是运行环境,用于执行已编译的 Java 程序。
  • JRE 包含了 JVM,JVM 是 Java 程序的运行环境,负责将字节码翻译成机器码并提供运行时支持。
  • JDK 不仅包含了 JRE 和 JVM,还提供了用于开发 Java 程序所需的工具和类库。
    在这里插入图片描述

1.2 什么是字节码?采用字节码的好处是什么?

在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C、 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。

1.3 Java 程序从源代码到运行的过程

在这里插入图片描述
我们需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT(Just in Time Compilation) 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言 。

在这里插入图片描述
HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。

1.4 JVM的生命周期

1.虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

2.虚拟机的退出有如下的几种情况:

  • 某线程调用Runtime类或System类的exit方法,或 Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
  • 程序正常执行结束。
  • 程序在执行过程中遇到了异常或错误而异常终止。
  • 由于操作系统出现错误而导致Java虚拟机进程终止 。

1.5 JVM架构图

在这里插入图片描述

2. 字节码

2.1 字节码文件是跨平台的吗?

是的
在这里插入图片描述

2.2 class文件里面是什么?

3. 解释器与JIT编译器

解释器(Interpreter)和 JIT 编译器(Just-In-Time Compiler)都是用于执行程序的工具,但它们的工作方式和作用有所不同。

解释器(Interpreter):

  1. 解释器是一种逐行执行程序代码的工具。它会逐行读取源代码,并将其转换成计算机可以理解的机器语言,然后执行这些指令。
  2. 解释器不会将整个程序代码一次性地转换成机器语言,而是在运行时逐行地解释和执行源代码。
  3. 由于逐行解释的特性,解释器的执行速度通常比较慢,尤其是对于循环和复杂逻辑的程序。

JIT 编译器(Just-In-Time Compiler):

  1. JIT 编译器是一种在运行时将程序代码动态地编译成机器语言的工具。它可以将整个函数或代码块编译成机器代码,然后直接执行编译后的机器代码。
  2. JIT 编译器通常会在程序首次执行时或者某个函数首次被调用时进行编译,以后再次执行相同代码时就可以直接使用编译后的机器代码,从而提高了程序的执行速度。 但这里注意,其实Java是半编译半解释型语言,热点代码会先经过解释器解释称字节码文件,待下次执行时直接在JIT编译器执行
  3. JIT 编译器通常会根据程序的运行情况和环境动态地进行优化,以提高程序的执行效率。

在这里插入图片描述

AOT编译器

在这里插入图片描述

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

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

相关文章

RocketMQ详细介绍及核心问题解释(很全)

1. RocketMq是什么 一个纯Java、分布式队列模型的消息中间件,具有高可用、高可靠、高实时、低延迟的特点。(记住这句就行了) 2. RocketMq有什么功能 1、业务解耦:这也是发布订阅的消息模型。生产者发送指令到MQ中,然…

pytorch06:权重初始化

目录 一、梯度消失和梯度爆炸1.1相关概念1.2 代码实现1.3 实验结果1.4 方差计算1.5 标准差计算1.6 控制网络层输出标准差为11.7 带有激活函数的权重初始化 二、Xavier方法与Kaiming方法2.1 Xavier初始化2.2 Kaiming初始化2.3 常见的初始化方法 三、nn.init.calculate_gain 一、…

多线程高级知识点

多线程高级知识点 1.ThreadLocal 1.1 什么是 ThreadLocal? ​ ThreadLocal 叫做本地线程变量,意思是说,ThreadLocal 中填充的的是当前线程的变量,该变量对其他线程而言是封闭且隔离的,ThreadLocal 为变量在每个线程…

高性能NVMe Host Controller IP

NVMe Host Controller IP 介绍 NVMe Host Controller IP可以连接高速存储PCIe SSD,无需CPU和外部存储器,自动加速处理所有的NVMe协议命令,具备独立的数据写入AXI4-Stream/FIFO接口和数据读取AXI4-Stream/FIFO接口,非常适合于超高…

插槽slot涉及到的样式污染问题

1. 前言 本次我们主要结合一些案例研究一下vue的插槽中样式污染问题。在这篇文章中&#xff0c;我们主要关注以下两点: 父组件的样式是否会影响子组件的样式&#xff1f;子组件的样式是否会影响父组件定义的插槽部分的样式&#xff1f; 2. 准备代码 2.1 父组件代码 <te…

mysql基础-数据操作之增删改

目录 1.新增数据 1.1单条数据新增 1.2多条数据新增 1.3查询数据新增 2.更新 2.1单值更新 2.2多值更新 2.3批量更新 2.3.1 批量-单条件更新 2.3.2批量-多条件更新 2.4 插入或更新 2.5 联表更新 3.删除 本次分享一下数据库的DML操作语言。 操作表的数据结构&#xf…

《计算机科学中的建模技术》复习点

0 考试题型 题型&#xff1a;选择、填空、大题&#xff08;综合题&#xff09; 分值&#xff1a;选择填空30分&#xff0c;综合70分 填空&#xff1a;基本概念题 第 1 章&#xff1a;计算机科学基本问题与数学建模概要 1.1 科学计算的基本概念 科学计算是指利用计算机来完成…

Transformer架构和对照代码详解

1、英文架构图 下面图中展示了Transformer的英文架构&#xff0c;英文架构中的模块名称和具体代码一一对应&#xff0c;方便大家对照代码、理解和使用。 2、编码器 2.1 编码器介绍 从宏观⻆度来看&#xff0c;Transformer的编码器是由多个相同的层叠加⽽ 成的&#xff0c;每个…

【数据结构】二叉树的概念及堆

前言 我们已经学过了顺序表、链表、栈和队列这些属于线性结构的数据结构&#xff0c;那么下面我们就要学习我们第一个非线性结构&#xff0c;非线性结构又有哪些值得我们使用的呢&#xff1f;那么接下来我们就将谈谈树的概念了。 1.树的概念与结构 1.1树的概念 树是一种非线性…

2.C++的编译:命令行、makefile和CMake

1. 命令行编译 命令行编译是指直接在命令行中输入以下指令&#xff1a; 预处理&#xff1a;gcc -E main.c -o main.i 编译&#xff1a;gcc -S main.i -o main.s 汇编&#xff1a;gcc -c main.s -o main.o 链接&#xff1a;gcc main.o -o main 命令汇总&#xff1a;gcc main.c …

【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

第17课 为rtsp流加入移动检测功能

在上节课&#xff0c;我们成功拿到了rtsp视频和音频流&#xff0c;在第13课&#xff0c;我们为普通的usb摄像头加上了移动检测功能&#xff0c;那能不能给rtsp摄像头也加上移动检测功能以实现一些好玩的应用呢&#xff1f;答案是肯定的&#xff0c;在usb摄像头检测中&#xff0…

BetaFlight开源代码之电压校准

BetaFlight开源代码之电压校准 1. 源由2. 分析数据流3. 采样电路3. 原理4. 示例5. 实测&转换数据6. 参考资料 1. 源由 既然复杂的BetaFlight开源代码之电流校准都过了一遍&#xff0c;电压相对来说是比较简单的&#xff0c;一起过一下 2. 分析数据流 电源路径1》采样电路…

【Spring实战】24 使用 Spring Boot Admin 管理和监控应用

文章目录 1. 定义2. 使用场景3. 主要功能4. 示例1&#xff09;[服务端] 添加依赖2&#xff09;[服务端] 相关配置3&#xff09;[服务端] 启动类4&#xff09;[服务端] 启动服务5&#xff09;[服务端] 浏览器访问6&#xff09;[客户端] 添加依赖7&#xff09;[客户端] 相关配置8…

双变量probit模型

1. Probit模型 1.1 模型含义 假设个体只有两种选择&#xff0c;y1或y0。影响选择的变量都包括在向量x中。即线性概率模型为 y值服从两点分布 被认为是连接函数&#xff0c;函数选择具有一定的灵活性。如果为标准正态的累积分布函数&#xff0c;则模型成为Probit模型&#xff…

网络嗅探器的设计与实现(2024)-转载

1.题目描述 参照 raw socket 编程例子&#xff0c;设计一个可以监视网络的状态、数据流动情况以及网络上传输 的信息的网络嗅探器。 2.运行结果 3.导入程序需要的库 请参考下面链接: 导入WinPcap到Clion (2024)-CSDN博客 4.参考代码 #define HAVE_REMOTE #define LINE_LEN …

【数据库原理】(11)SQL数据查询功能

基本格式 SELECT [ALL|DISTINCT]<目标列表达式>[,目标列表达式>]... FROM <表名或视图名>[,<表名或视图名>] ... [ WHERE <条件表达式>] [GROUP BY<列名 1>[HAVING <条件表达式>]] [ORDER BY <列名 2>[ASC DESC]];SELECT: 指定要…

WinForms中的UI卡死

WinForms中的UI卡死 WinForms中的UI卡死通常是由于长时间运行的操作阻塞了UI线程所导致的。在UI线程上执行的操作&#xff0c;例如数据访问、计算、文件读写等&#xff0c;如果耗时较长&#xff0c;会使得UI界面失去响应&#xff0c;甚至出现卡死的情况。 解决方法 为了避免…

061:vue中通过map修改一维数组,增加一些变量

第061个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

系列二、GitHub中的Alpha、Beta、RC、GA、Release等各个版本

一、GitHub中的Alpha、Beta、RC、GA 1.1、概述 1.2、参考 https://www.cnblogs.com/huzhengyu/p/13905129.html