一、jvm和Java体系结构

62 阅读20分钟

java 语言虽然在近些年逐渐下降,但是在一些使用场景还是有明确的优势,企业级开发中仍然占有很重要的地位。
TIOBE 排行榜 :www.tiobe.com/tiobe-index…

不管之后如何发展,了解 Java运行逻辑,底层原理,对仍然使用Java开发的我们仍然必不可少。就算跨语言了,jvm 的思想依然值得我们学习。

Java生态圈

 Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大Java 也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。

作为一个平台,Java虚拟机扮演着举足轻重的作用 Groovy、Scala、JRuby、Kotlin等都是Java平台的一部分 作为一种文化,Java几乎成为了“开源”的代名词。 第三方开源软件和框架。如Tomcat、Struts,MyBatis,Spring等。 就连JDK和JVM自身也有不少开源的实现,如openJDK、Harmony。 

作为一个社区,Java拥有全世界最多的技术拥护者和开源社区支持,有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到Java的身影。其应用形式之复杂、参与人数之众多也令人咋舌。

Java 是跨平台的语言

JVM 跨语言的平台

当然jvm 作为Java的一部分 想了解jvm 发展,应该先了解   java 的脉络

Java 发展事件脉络

1、诞生与早期奠基(1990-2000)

时间

核心事件

影响与意义

1990年

Sun公司成立「Green Team」(James Gosling领衔),为嵌入式设备开发新语言「Oak」

Java的雏形诞生,核心目标是「跨平台、简洁、可靠」

1995年5月

Sun正式发布语言,更名「Java」,同步推出HotJava浏览器(首个支持Java Applet的浏览器)

Java首次公开亮相,「Write Once, Run Anywhere」(一次编写,处处运行)理念引爆行业

1996年1月

发布 JDK 1.0,包含JVM、基础类库(java.lang、java.io等)、Applet技术

Java开发环境正式成型,标志着语言从概念走向实用

1997年2月

发布 JDK 1.1,新增内部类、反射、JDBC(数据库连接)、RMI(远程方法调用)

补全核心功能,JDBC奠定Java与数据库的对接基础,反射开启框架生态雏形

1998年12月

发布 JDK 1.2(后更名Java 2),拆分三大平台:J2SE(桌面)、J2EE(企业)、J2ME(移动)

Java从单一语言转向「全场景平台」,J2EE为后续企业级开发铺路

1999年

JCP(Java Community Process)成立,负责Java规范制定与版本管理

建立开放的社区治理模式,保障Java生态的标准化与兼容性

2000年5月

发布 JDK 1.3,HotSpot虚拟机成为默认JVM,新增Java Naming(JNDI)、JavaSound

HotSpot的引入大幅提升性能,成为后续Java虚拟机的核心基础

2000年11月

发布 JDK 1.4,新增NIO(非阻塞IO)、正则表达式、XML解析(JAXP)、断言

解决高并发IO痛点,正则/XML支持适配互联网场景,Java开始向企业级深度渗透

2、成熟与生态爆发(2001-2010)

时间

核心事件

影响与意义

2004年9月

发布 Java SE 5.0(原JDK 1.5),新增泛型、增强for循环、枚举(Enum)、注解(Annotation)、自动装箱拆箱

语法层面重大革新,代码简洁度与安全性大幅提升,注解成为Spring等框架的核心依赖

2006年12月

发布 Java SE 6,同时宣布Java开源,成立OpenJDK社区,HotSpot虚拟机开源

打破封闭生态,OpenJDK成为Java官方参考实现,吸引全球开发者参与贡献

2009年

Spring Framework 3.0发布,全面支持Java 5+注解,推动Java企业级开发标准化

Spring成为Java生态「事实标准框架」,奠定企业级开发的技术基石

2010年1月

Oracle以74亿美元收购Sun公司,获得Java商标、JDK版权、HotSpot虚拟机所有权

Java所有权易主,Oracle后续主导版本迭代与商业授权,引发生态对「开源性」的担忧

3、Oracle主导与性能革新(2011-2018)

时间

核心事件

影响与意义

2011年7月

发布 Java SE 7,新增try-with-resources、钻石运算符(<>)、NIO.2、G1垃圾回收器(预览)

简化资源管理语法,NIO.2支持文件系统增强,G1为后续低延迟GC铺路

2014年3月

发布 Java SE 8(LTS长期支持版本),新增Lambda表达式、Stream API、函数式接口、Optional

Java拥抱函数式编程,Stream API彻底改变集合数据处理方式,成为至今最主流的Java版本

2017年9月

发布 Java SE 9,引入模块化系统(JPMS)、G1成为默认GC、JShell交互式工具

解决「JAR地狱」问题,模块化提升大型应用可维护性,G1优化垃圾回收延迟

2018年3月

发布 Java SE 10,新增局部变量类型推断(var关键字)、应用类数据共享(CDS)

简化变量声明语法,CDS提升应用启动速度

2018年9月

发布 Java SE 11(LTS版本),推出ZGC(实验性低延迟GC)、移除Java EE模块、调整授权许可

ZGC实现「毫秒级停顿」,为高并发场景赋能;Java EE移交Eclipse基金会,更名Jakarta EE

四、快速迭代与性能巅峰(2019-2024)

时间

核心事件

影响与意义

2019年3月

发布 Java SE 12,新增Shenandoah GC(RedHat主导,低延迟)、switch表达式(预览)

垃圾回收器多元化,Shenandoah与ZGC形成「双低延迟GC」格局

2019年9月

发布 Java SE 13,switch表达式正式定稿、文本块(Text Blocks,预览)

简化多行字符串编写,switch支持返回值,语法更灵活

2020年3月

发布 Java SE 14,记录类(Record,预览)、instanceof模式匹配(预览)

减少「数据载体类」的模板代码,模式匹配开启语法简化新篇章

2020年9月

发布 Java SE 15(非LTS),密封类(Sealed Classes,预览)、文本块正式定稿

控制类的继承关系,提升代码安全性;文本块成为正式特性,适配JSON/XML等场景

2021年3月

发布 Java SE 16,记录类、instanceof模式匹配正式定稿,Vector API(孵化)

函数式编程与数据处理能力持续增强,Vector API为数值计算优化性能

2021年9月

发布 Java SE 17(LTS版本),密封类正式定稿、移除实验性AOT编译,强化安全更新

至今主流LTS版本,兼容性与性能兼顾,成为企业级应用的首选版本之一

2022年3月

发布 Java SE 18,UTF-8成为默认字符集、WebAssembly支持(预览)

解决跨平台字符集兼容问题,WebAssembly支持打通Java与前端生态的交互通道

2022年9月

发布 Java SE 19,虚拟线程(Virtual Threads,预览)、作用域值(Scoped Values,预览)

彻底革新Java并发模型,虚拟线程实现「轻量级多线程」,大幅提升高并发场景吞吐量

2023年3月

发布 Java SE 20,结构化并发(Structured Concurrency,预览)、switch模式匹配(预览)

简化并发编程的异常处理与资源管理,switch支持更复杂的模式匹配逻辑

2023年9月

发布 Java SE 21(LTS版本),虚拟线程、结构化并发、switch模式匹配正式定稿

Java并发编程进入「新时代」,虚拟线程降低高并发开发门槛,性能接近Go语言

2024年3月

发布 Java SE 22,灵活构造函数体(super前允许执行语句,预览)、字符串模板(预览)

解决构造函数初始化限制,字符串模板简化动态字符串拼接(替代String.format)

2024年9月

发布 Java SE 23,字符串模板正式定稿、作用域值正式定稿、外部函数与内存API(正式版)

动态字符串拼接更高效安全,作用域值替代ThreadLocal(线程安全),打通Java与原生代码交互

五、近期关键更新(2025年)

时间

核心事件

影响与意义

2025年3月

发布 Java SE 24,模式匹配支持基本类型(预览)、紧凑源文件(预览)

统一基本类型与引用类型的模式匹配语法,紧凑源文件简化单文件程序开发

2025年9月

发布 Java SE 25(LTS版本,支持至2033年)

Oracle史上支持周期最长的LTS版本,生态稳定性大幅提升

2025年9月

Java 25核心特性定稿:模式匹配基本类型、紧凑源文件+实例main方法、灵活构造函数体

语法层面持续简化,开发者效率提升;核心特性经过多轮预览优化,兼容性更优

2025年10月

Oracle发布JDK 25.0.1、21.0.9、17.0.17等季度补丁更新,BellSoft等厂商同步跟进

修复安全漏洞(CVE),保障LTS版本的生产环境稳定性

Java的发展始终围绕「跨平台、高性能、开发者效率」三大核心,从早期的语言奠基,到企业级生态爆发,再到Oracle主导下的「快速迭代+LTS稳定支持」双轨制,最终通过虚拟线程、低延迟GC等技术,持续巩固在企业级开发、大数据、云原生等领域的统治地位。2025年Java 25的发布,进一步强化了其「长期支持+语法革新」的路线,生态生命力依然强劲。

接下来详细介绍jvm 

1,什么是jvm  ?

jvm就是Java虚拟机(JVM,Java Virtual Machine)

想了解这个概念我们先聊一下,什么是虚拟机

所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 大名鼎鼎的Virtual Box,VMware就属于系统虚拟机,它们完全是对物理计算机硬件的仿真(模拟),提供了一个可运行完整操作系统的软件平台。 程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。 无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

Java虚拟机 jvm

Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。

 JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。

作用: Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。

特点: 一次编译,到处运行 自动内存管理 自动垃圾回收功能

JVM的位置

JVM是运行在操作系统之上的,它与硬件没有直接的交互

Java 体系结构, 以及jvm 在Java中所处的位置

JVM的整体结构

a,HotSpot VM是目前市面上高性能虚拟机的代表作之一。

b,它采用解释器与即时编译器并存的架构。

c,在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++程序一较高下的地步。

JVM的架构模型 

Java编译器输入的指令流基本上是一种基于栈的指令集架构

另外一种指令集架构则是基于寄存器的指令集架构

具体来说:这两种架构之间的区别: 

1, 基于栈的指令集架构 基于栈式架构的特点: 设计和实现更简单,适用于资源受限的系统; 避开了寄存器的分配难题:使用零地址指令方式分配 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现 不需要硬件支持,可移植性更好,更好实现跨平台 基于寄存器的指令级架构 

2,基于寄存器架构的特点: 典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机。 指令集架构则完全依赖硬件,与硬件的耦合度高,可移植性差 性能优秀和执行更高效 花费更少的指令去完成一项操作 在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主 

两种架构的举例 

同样执行2+3这种逻辑操作,其指令分别如下:

 基于栈的计算流程(以Java虚拟机为例):

iconst_2 //常量2入栈
istore_1
 iconst_3 // 常量3入栈
 istore_2
iload_1
 iload_2
 iadd //常量2/3出栈,执行相加
 istore_0 // 结果5入栈

 需要8个指令

而基于寄存器的计算流程

mov eax,2 //将eax寄存器的值设为1
add eax,3 //使eax寄存器的值加3 

仅需要2个指令

JVM架构总结

由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。栈的优点:跨平台,指令集小,编译器容易实现,缺点是性能比寄存器差一些。 时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpot VM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢? 因为基于栈的架构跨平台性好、指令集小,虽然相对于基于寄存器的架构来说,基于栈的架构编译得到的指令更多,执行性能也不如基于寄存器的架构好,但考虑到其跨平台性与移植性,我们还是选用栈的架构

大概了解了jvm 后 
我们也跟java 一样了解一下jvm 的发展历史

jvm 发展史

阶段1:起源与奠基期(1990s - 2000年初)—— 从无到有,确立基础架构

时间

关键事件

核心技术突破

历史意义

1996年1月

Sun Classic VM随JDK 1.0发布

首款商用JVM,仅含解释器,无JIT编译器;支持基础字节码解释、简单内存管理

实现Java「一次编写,处处运行」的核心理念,奠定JVM技术雏形

1997年

Sun收购Longview Technologies,获得HotSpot技术

引入「热点代码探测」+ 即时编译(JIT),解释器与编译器协同工作(混合执行模式)

突破纯解释器的性能瓶颈,为Java后续普及奠定性能基础

1998年12月

HotSpot VM随JDK 1.2(J2SE)成为默认JVM

完善基础内存模型(堆/方法区/栈),支持J2SE/J2EE/J2ME多平台适配

JVM统一标准,Java从单一语言转向全场景平台,开启企业级应用渗透

阶段2:稳定与优化期(2000 - 2010年)—— 性能提升,GC与多场景适配

时间

关键事件

核心技术突破

历史意义

2002年

JDK 1.4.2引入增量式GC

减少GC单次停顿时间,适配桌面应用与小型企业系统

首次聚焦GC延迟优化,解决Java应用「卡顿」痛点

2004年9月

Java SE 5.0发布,引入并行GC(Parallel GC)

利用多核CPU并行执行垃圾回收,提升吞吐量;优化内存分配算法

适配多核处理器趋势,Java性能首次比肩C++在批处理场景的表现

2006年12月

Java SE 6发布,引入CMS收集器(Concurrent Mark Sweep)

并发标记-清除,实现「低停顿GC」,仅在初始标记/重新标记阶段暂停应用

满足企业级应用(如电商、金融)对低延迟的需求,Java进入企业级核心场景

2008年

Oracle收购BEA,获得JRockit VM技术

JRockit以「零停顿GC(Zing)」和低延迟著称,擅长服务器端高并发场景

为后续HotSpot与JRockit技术融合埋下伏笔,丰富JVM性能优化思路

阶段3:变革与整合期(2010 - 2019年)—— 所有权变更,模块化与GC革新

时间

关键事件

核心技术突破

历史意义

2010年1月

Oracle正式收购Sun,获得Java商标、HotSpot所有权

启动HotSpot与JRockit技术整合(如JRockit的JVMCI编译器融入HotSpot)

JVM进入Oracle主导时代,开启标准化与商业化并行发展模式

2011年7月

Java SE 7发布,G1收集器(Garbage-First)进入预览阶段

区域化分代回收,支持可预测停顿时间,兼顾吞吐量与延迟

为大内存应用(如大数据、分布式系统)提供解决方案,GC技术从「单一目标」转向「平衡目标」

2014年3月

Java SE 8(LTS)发布,JVM支持Lambda/Stream API

新增invokedynamic字节码指令,优化函数式编程运行时效率;G1性能优化

Java拥抱函数式编程,JVM适配新语法特性,成为至今最主流的Java版本

2017年9月

Java SE 9发布,模块化系统(JPMS)上线,移除永久代(PermGen)引入元空间(Metaspace)

- 模块级类加载隔离,解决「JAR地狱」;
- 元空间基于本地内存,避免永久代溢出

JVM架构重构,适配大型复杂应用的模块化开发,内存管理灵活性大幅提升

2018年9月

Java SE 11(LTS)发布,ZGC进入实验阶段,移除CMS收集器(实验性)

ZGC实现「毫秒级停顿」,支持TB级内存;OpenJDK成为官方参考实现

开启低延迟GC新纪元,Java开源生态(如Temurin、Corretto)崛起

阶段4:高并发与低延迟巅峰期(2020 - 2025年)—— 线程模型革命,云原生适配

时间

关键事件

核心技术突破

历史意义

2020年9月

Java 15发布,ZGC支持全平台(macOS/Windows),Shenandoah GC正式转正

Shenandoah实现「并发整理」,停顿<10ms;ZGC跨平台适配

低延迟GC从「Linux专属」走向全场景,Java适配桌面/服务器/云原生多环境

2021年9月

Java 17(LTS)发布,强化ZGC/Shenandoah,移除实验性CMS

G1/ZGC/Shenandoah形成「GC铁三角」,元空间优化内存占用

企业级应用首选LTS版本,JVM稳定性与性能达到新高度

2023年9月

Java 21(LTS)发布,虚拟线程(Virtual Threads)正式转正,ZGC多世代预览

- 虚拟线程(M:N映射)支持百万级并发,打破OS线程限制;
- 多世代ZGC提升小对象回收效率

Java并发模型革命,高并发开发门槛大幅降低,ZGC兼顾低延迟与高吞吐

2024年9月

Java 23发布,ZGC多世代正式转正,FFM API(外部函数与内存API)落地

- 多世代ZGC成为默认,吞吐量提升30%+;
- FFM API替代JNI,原生交互更高效安全

JVM解决原生代码交互痛点,GC技术覆盖从小内存到TB级超大内存全场景

2025年9月

Java 25(LTS)发布,JVM支持10TB+超大内存,虚拟线程调度优化

- ZGC突破内存上限,适配云原生超大内存实例;
- 虚拟线程支持协作式中断与工作窃取调度

JVM成为云原生核心运行时,ARM架构适配(M系列/Graviton)性能追平x86

2025年10月

开源JVM生态更新(OpenJ9 25.0、Temurin JVM 25)

开源JVM全面兼容虚拟线程/ZGC,强化边缘计算场景优化

JVM生态多元化,HotSpot/GraalVM/OpenJ9形成多极格局,适配不同场景需求

核心技术演进脉络(按模块划分)

1. 执行引擎演进

  • 1996:纯解释器(Classic VM)→ 1997:解释器+JIT混合执行(HotSpot)→ 2014:invokedynamic指令支持动态语言(Java 8)→ 2024:GraalVM AOT+JIT协同(Java 23+)→ 2025:ARM架构专用编译器优化

2. 垃圾回收(GC)演进

  • 基础GC(串行GC)→ 并行GC(吞吐量优先)→ CMS(低延迟,并发标记清除)→ G1(区域化分代,可预测停顿)→ ZGC/Shenandoah(毫秒级停顿,TB级内存)→ 多世代ZGC(2024+,兼顾吞吐与延迟)→ 10TB+内存支持(2025)

3. 内存模型演进

  • 1996:堆(新生代/老年代)+ 永久代(PermGen)→ 2017:元空间(Metaspace,本地内存)→ 2025:元空间分层管理(年轻代/老年代元空间)

4. 线程模型演进

  • 1996:1:1线程模型(Java线程映射OS线程)→ 2023:虚拟线程(M:N映射,轻量级)→ 2025:虚拟线程调度优化(工作窃取、协作式中断)

5. 架构与生态演进

  • 单一JVM(HotSpot)→ 多JVM并存(HotSpot/GraalVM/OpenJ9/Temurin)→ 模块化架构(JPMS)→ 云原生适配(容器化、超大内存、ARM支持)

2025年JVM生态现状

  • 主流JVM产品:Oracle HotSpot(官方主力)、GraalVM(高性能/AOT)、Eclipse OpenJ9(轻量跨平台)、Adoptium Temurin(开源兼容);
  • 核心应用场景:企业级微服务、云原生容器、大数据(Spark/Flink)、边缘计算、金融高并发系统;
  • 未来趋势:进一步优化虚拟线程调度、深化云原生资源适配、强化AI辅助性能调优、扩展异构计算(GPU/TPU)支持。