为什么需要 JVM?它处在什么位置?
Java 程序到底是如何执行的?
JVM 和操作系统的关系

工程师就相当于铸剑的剑师,JVM 便是剑炉。
JVM全称为Java Virtual Machine(简称Java Virtual Machine),它是我们耳熟能详的Java虚拟机。它能够识别.class后缀文件,并解析指令以调用操作系统函数来执行所需操作;此外还能与其他系统进行交互协作并完成复杂任务;为了帮助大家更好地掌握相关知识体系与实践经验;现向大家推荐一个架构学习交流群:伪鑫同学创建的学习群组内分享了许多优质的学习资源;包括Spring框架源码分析、MyBatis框架源码解析以及Netty服务器原理讲解;还有高并发、高性能、分布式系统设计与微服务架构原理等课程内容;特别强调了JVM性能调优技巧以及分布式架构的应用场景与实践方法;目前已有许多同学受益良多
一般情况下,在使用C++进行程序开发后生成二进制文件并将其直接运行时即可让系统识别该程序;而针对Java语言而言,则需要经过编译生成.class文件之后还需要依靠特定命令来激活这些文件使其被操作系统所识别
你可能会想:如果我们像C++那样编译好的二进制文件能否立即在操作系统的层面上执行呢?非要去构建一个程序与操作系统的中间层虚拟机吗?
这就是 JVM 所具有的独特优势所在。大家都知道 Java 是一种高度抽象的语言 提供了包括自动内存管理在内的多个重要特性。这些重要特性难以在操作系统的层面实现。
有了上面的介绍,我们就可以做如下的类比。
- JVM:等同于操作系统;
- Java 字节码:等同于汇编语言。
The bytecode of Java is generally quite readable. This suggests that the level of abstraction in Java language structures is notably high. You can consider the JVM as a translator that continuously translates and executes Java bytecode while invoking native operating system functions that are highly relevant to specific hardware platforms. In this discussion group, I would like to introduce a platform where you can access a wealth of interview questions and answers (https://www.example.com/pony), along with video tutorials from experienced architects who delve into Spring source code analysis, MyBatis source code analysis, and Netty source code analysis. These topics encompass the principles of high concurrency, high performance, distributed systems, and microservices architectures. Additionally, you'll find insights into JVM performance optimization and distributed architecture design—these are essential components of any architect's knowledge base. Furthermore, you can avail yourself of free learning resources to enhance your skills. Many have already benefited from these materials.
如果你还是对上面的介绍有点模糊,可以参考下图:

从图形界面可以看出,在引入了JVM这一抽象层后,Java就能够实现跨平台应用。只要确保JVM能够正确执行.class文件即可在Linux、Windows以及MacOS等多种平台上运行。
而 Java 的跨平台特性在于实现了单一编译过程,并且实现了无处不在地运行能力;这一成就功归于JVM的强大支持。例如,在 Maven 仓库中下载同一版本的 jar 包就可以实现无处不在地运行,并无需为每个平台单独进行编译操作。
现有的几种JVM扩展语言(如Clojure、JRuby和Groovy等),经过编译后都会生成.class文件。对于该开发环境中的开发者而言(尤其是Java开发人员),只需正确配置JVM参数(而非简单地调整),就能使这些扩展语言在JVM上平滑地运行起来。
我们能够以一句话简明扼要地阐述JVM与操作系统的关联性:JVM基于开发语言建立之上,并连接到操作系统层面上的运行环境;其中字节码充当了两者之间的桥梁角色。
然而 Java 程序与我们常用的 C++ 程序有何不同之处?通过两幅图来展示


通过对比两张图可以看出C++程序经过编译生成为操作系统可识别的.exe文件;而Java程序则被编译生成为JVM能够识别的.class文件;随后由JVM负责调用系统函数以执行程序的过程。在此本人向大家分享一个架构学习交流社群:交流学习伪鑫:1253431195(里面有大量的面试题及答案)。在该社群中会分享一些资深架构师录制的专业视频课程:涵盖Spring、MyBatis、Netty源码分析等内容;还有高并发、高性能、分布式、微服务架构原理讲解;以及JVM性能优化和分布式架构等内容;这些知识体系堪称成为架构师必备的学习资源库。此外还可以领取免费的学习资源包;目前已有大量受益者
JVM、JRE、JDK的关系

通过学习我们知道JVM是Java程序运行的核心。请注意的是,JVM自身无法独立操作,必须为其准备所需材料(.class文件)。如谚语所言,高明之人亦未必能成事,因为缺少必要的条件支持.即便拥有强大的功能,依然无法脱离外部环境的支持
只有JVM, 不能独立完成一次编译, 无处不用。它必须依赖一个基础的类库集合。例如提供文件操作功能和网络连接支持。Java体系慷慨大方。一次性提供所有必要的类库。JVM 标准结合其实现的一系列基础组件即可构成 JRE(Java Runtime Environment)。
安装了JRE后, 我们的Java程序便可以在浏览器中正常运行。
大家可以查看自己安装的Java目录, 如果仅仅需要执行一些Java程序, 则只需一个JRE就足够。
JDK 的规模确实有所拓展。除了 Java Runtime Environment(JRE),JDK 还提供了许多实用的辅助工具包如 javac、java、jar 等功能强大的组件。作为 Java 开发的关键组件之一,在掌握这些技术后可以让非技术人员也能轻松掌握开发要诀!
我也常会查阅一下 JDK 的全拼缩写 Java Development Kit 。我对 'kit' 这个词特别害怕 ,它如同深渊般的神秘感 ,让人觉得永远有更多关于它的知识值得探索 。关于 JVM 、JRE 和 JDK 三者之间的关系 ,可以用它们之间存在包含关系来简明概括 。在此我想邀请大家加入一个架构学习交流群 。群号:1253431195 (注明:这是一个用于分享专业技术知识的专业学习平台) 。在群里会有一些资深人士定期分享视频课程 ,涵盖 Spring 框架源码解析 、MyBatis 项目的实践以及 Netty 网络编程技巧等内容 ,还有高并发 、高性能 、分布式 以及微服务等前沿技术的研究与探讨 。此外 ,群里还会为大家提供免费的学习资源包 ,目前已有大量读者受益匪浅 。
- JDK>JRE>JVM

Java 虚拟机规范和 Java 语言规范的关系
当我们提及 JVM 时,“我们通常想到的是其垃圾回收机制”,然而实际上它还包含更多功能,“例如其字节码解析模块负责驱动这些功能”。从广义上来看,“JVM 被视为一个规范文档”,它是官方和准确的标准文件;但从具体应用的角度看,“由于我们更倾向于使用 Hotspot 技术”,在讨论这一术语时,“我们会将其与相关的功能模块视为同一概念”。
如果补充我们日常使用的Java语言的话,能够呈现一张详细图表。这对Java开发人员来说是核心基础。

左半部分涉及的是 Java 虚拟机规范,在为输入和执行字节码提供一个运行环境的同时搭建起一个独立的执行平台;右半部分则是我们常说的 Java 语法规范,在编译阶段将这些语法结构转化为具体的字节码指令;而连接左右两部分的关键依然是通过编译器将这两部分内容有机融合在一起形成完整的字节码序列。
如果 .class 文件的结构是固定的,那么这两部分优化工作是可以独立开展的。然而,在某些特殊情况下(如偶尔),Java 会扩展 .class 文件的格式,并添加一些字节码指令以支持新增特性。
Java虚拟机可以被视为一台抽象的计算机系统,在其运行过程中包含了完整的指令集以及多种运行时内存区域以支持其功能。
你可能会有这样的疑问:如果不学习JVM会有什么影响呢?理论上两者之间并没有直接的关系。它们之间的交互主要通过.class文件完成;即使不熟悉JVM机制也能编写大部分Java代码。类似于编写C++代码那样,并不需要深入掌握操作系统的底层实现。
然而,在编写高效且巧妙的代码时,
需要掌握一些执行层面的知识。
熟悉 JVM 的相关内容,
主要用于性能优化和故障诊断。
你将能够全面掌握运行中的资源分配情况。
我们写的 Java 代码到底是如何运行起来的
最后,在深入分析了一个Java程序的工作原理后,请问您想了解什么呢?
该Java程序采用文本格式编写。例如,在此代码示例中(如HelloWorld.java),它严格遵循Java语言规范进行设计与实现。在实现过程中调用System.out等模块,在JRE环境中即可正常运行并提供所需功能。
使用 JDK 的工具 javac 进行编译后,会产生 HelloWorld 的字节码。
我们经常提及 Java 字节码是连接 JVM 和 Java 程序的重要纽带。接下来使用 javadump 来详细解析一下字节码的结构。
Java 虚拟机采用了基于栈架构的设计模式。其指令由操作码与操作数组构成。这些字节码指令被称为 opcode。其中 getstatic ldc invokevirtual 和 return 等 是典型的 opcode 示例
我们可以持续关注字节码的二进制表示形式。与上述字节数对应的二进制形式即为以下这些数值(建议查阅相关资料)。
我们可以看一下它们的对应关系。
opcode 占用一个字节,并且其取值范围是0到255。这意味着指令集的操作码个数不足以支持超过256条指令的数量。紧随 opcode 后的是被操作的对象。例如,在b2指令中使用参数编码为1时(即b1),表示从内存位置偏移为8字节的位置加载类加载器信息。
JVM 主要通过解码或解析这些 opcode 和操作数来执行程序处理。当我们在命令行使用 Java 命令运行 .class 文件时,在本质上就是启动了一个 JVM 运行时环境。
JVM会对这些bytecode进行解析,并分为两种主要的执行模式.其中最为常见的做法是解释型执行,即将opcode与操作数组合转化为机器指令序列;而另一种则是即时编译(JIT),即在特定条件下将bytecode直接转换为机器码后再进行后续处理.
这些预编译.class文件将被逐个加载并存储在metaspace中,在调用时准备好并等待调用,在此过程中涉及一个类加载器的概念。
而 JVM 程序的执行主要是在堆和栈之间进行操作,并且其行为具有相似性与其他普通程序的行为模式是一致的。具体来说,则分为堆和栈两部分。举个例子来说,在我们处理 main 方法时就会为其分配一个专门的栈帧位置;一旦退出该方法体后则会相应地弹出该进程使用的那个特定位置由此可见大量字节码指令会对这些特定位置进行一系列的操作步骤
而较大尺寸的数据块,则是以物理内存空间的形式存在。相较于C++等语言,在内存划分上Java展现出了更高的精细度。对于这些术语,在互联网上可以找到更多深入的解释和讨论。
最后大家看下面的图,其中 JVM 部分是重要点。

总结:
1.为什么 Java 研发系统需要 JVM?
JVM 解释的是与汇编语言类似的字节码,并非直接使用的机器指令代码。基于抽象运行时环境的需求而存在。为了满足这一虚拟环境的要求,JVM 需要解决一系列问题:包括字节码加载,自动垃圾回收以及并发处理等关键环节。它本质上是一个规范文档,不仅规定了.class文件的结构及其加载机制,并且涵盖了数据存储和运行时栈等内容,最常用的 JVM 实现就是 Hotspot 系列版本。为了帮助大家更好地理解这一复杂的体系,我向大家推荐一位架构学习领域的优秀分享者——伪鑫同学(微信公众号:伪鑫)。他在里面分享了大量的面试题及其答案解析,并深入剖析了 Spring 源码分析,高并发、高性能以及分布式架构设计等技术要点,JVM性能优化方面有着深入的研究经验。此外,他还会赠送一套完整的学习资料,帮助大量读者提升了专业能力
2.对你 JVM 的运行原理了解多少?
JVM 的运行周期与 Java 程序的整体运行过程具有相似性,在程序退出执行阶段,则其对应的虚拟机实例也随之终止活动状态。在整体架构中占据着关键地位的 JVM 会根据系统的负载情况动态分配资源以维持服务稳定性的需求。对于其内部工作原理这一话题,则会在后续专门的技术文章中进行详细阐述
3.Java 代码到底是如何运行起来的?
一个Java程序首先编译生成.class文件随后JVM将其加载至元数据区域执行引擎将通过混合模式处理这些字节码在运行时这些字节码会被转换为操作系统相关的功能JVM则以.class文件的形式作为独立运行环境存在接受输入的字节码并调用相应的操作系统函数
