【JVM原理详解】02-JVM发展史与主流实现
JVM发展史与主流实现引言理解了字节码是Java跨平台的中间表示之后一个自然的问题是这些字节码究竟由谁来执行答案是JVM的实现。HotSpot VM作为目前最主流的选择并非一蹴而就它经历了从Sun Classic VM到Exact VM再到HotSpot的漫长演进。同时JVM生态中还存在OpenJ9、GraalVM、Azul Zing等各具特色的实现。了解这段发展史和各个实现的差异能帮助你在技术选型时做出更明智的决策也能更好地理解现代JVM中许多设计决策的来龙去脉。Sun Classic VM到HotSpot的演进历程Sun Classic VMJDK 1.0 - 1.2Java诞生之初搭载的是Sun Classic VM它采用纯解释执行的方式逐条翻译字节码指令执行。可以想象当年在486或早期Pentium处理器上纯解释执行的Java程序运行速度并不理想。但它的意义在于验证了WORA概念的可行性。Classic VM最大的缺陷不是性能差而是解释器和JIT编译器无法共存——用户要么选择纯解释模式获得更快的启动速度要么选择纯JIT模式获得更好的运行性能两者不可兼得。这种二选一的设计在当时的技术条件下是不得已的妥协。Exact VMJDK 1.2实验性为了弥补Classic VM的缺陷Sun开发了Exact VM也叫Exact Memory Management VM。它的核心改进是引入精确式垃圾回收Exact GCJVM能精确知道内存中哪些位置是对象引用、哪些是基本类型从而避免了Classic VM中保守式GC无法回收部分内存的问题。Exact VM还首次尝试让解释器和编译器混合工作——这是后来HotSpot分层编译的思想萌芽。不幸的是Exact VM在JDK 1.2中仅作为实验性选项可用通过-Xexact参数启用很快就被战略转向HotSpot而终止。在商业操作系统Solaris上Exact VM短暂地成为过默认VM但在更广泛的平台上从未完全取代Classic VM。HotSpot VM的崛起JDK 1.3至今1999年Sun收购了Longview Technologies公司一家专注于高性能虚拟机技术的小型初创公司其核心产品就是HotSpot VM。Sun在JDK 1.3中正式将HotSpot作为默认JVM从此开启了长达20余年的主导地位。HotSpot的核心思想是自适应优化Adaptive Optimization运行时持续监控热点代码将编译资源集中在最需要优化的方法上。这种策略的洞察在于——程序通常遵循二八定律20%的代码消耗了80%的执行时间。与其对所有代码盲目编译不如将资源精准投入到热点代码上。HotSpot发展中的几个关键里程碑JDK 5引入java.lang.managementAPI使JVM内部状态可观测Generational GC稳定运行JDK 6引入逃逸分析Escape Analysis和同步消除Lock Elision等高级优化CMS GC走向成熟JDK 7引入invokedynamic指令为JVM上的动态语言如JRuby、Groovy提供底层支持G1 GC首次亮相JDK 8移除永久代PermGen改用元空间Metaspace存储类元数据Lambda表达式通过invokedynamic实现JDK 9G1成为默认GC模块化系统Jigsaw上线JDK 11LTSZGC实验性引入面向超低延迟场景Epsilon GCNo-Op GC作为测试用途JDK 17LTSZGC和Shenandoah GC进入生产就绪状态密封类Sealed Classes等语言特性落地Oracle JDK与OpenJDK的关系这个问题在面试中出镜率很高但很多人的理解不够准确。核心事实是OpenJDK是Oracle主导的开源项目HotSpot VM的源代码就托管在OpenJDK仓库中。Oracle JDK则是Oracle基于OpenJDK构建的商业发行版。从JDK 11开始两者在功能上趋于一致。关键差异在于维度Oracle JDKOpenJDK许可证Oracle Technology Network License (OTN)GPL v2 with Classpath Exception长期支持付费订阅获得LTS更新社区支持6个月更新周期商业特性包含Java Flight Recorder等JDK 8时从JDK 11起全部开源安装包Oracle提供官方安装程序各厂商自行打包分发2017年的转折点Oracle宣布将OpenJDK和Oracle JDK的代码库合并这意味着从JDK 11起两者在技术层面已经几乎等价。这对生态系统的影响深远——原本依赖Oracle JDK商业特性的用户现在可以直接使用OpenJDK及其衍生发行版。几乎等价意味着仍有细微差异Oracle JDK可能包含某些Oracle特定的优化补丁和加密算法实现且安装包格式和更新机制不同。但对于绝大多数应用场景选择一个主流的OpenJDK发行版与使用Oracle JDK在功能上没有可感知的区别。主流JVM实现对比HotSpot VMHotSpot是Java世界的标准答案。经过20余年持续优化它在吞吐量和响应时间之间取得了广泛认可的平衡。C2编译器能够生成非常高质量的机器码G1/ZGC/Shenandoah等GC的持续演进让它在延迟敏感型场景也有不俗表现。HotSpot对Java语言特性的支持是第一时间的因为Java语言规范JLS和JVM规范JVMS都来自于同一个团队。如果你使用的是标准Java企业应用HotSpot几乎是默认且正确的选择。OpenJ9Eclipse基金会原IBM J9IBM早在Java 1.0时代就开始开发自己的JVM实现——J9 VM用于IBM的中间件和硬件平台。2017年IBM将J9捐赠给Eclipse基金会改名为OpenJ9。OpenJ9的设计理念与HotSpot有本质区别启动速度OpenJ9通过共享类缓存Shared Class Cache, SCC技术和更积极的AOT编译启动速度通常比HotSpot快40%以上内存占用OpenJ9默认使用更紧凑的对象头并为不同的GC策略提供了多种内存布局选项整体内存占用比HotSpot低30%-50%吞吐量在长时间稳定运行场景下HotSpot的C2编译器持续优化能力更强通常峰值吞吐量略高于OpenJ9OpenJ9在云原生场景下表现出色容器化部署中对启动速度和内存占用的要求比峰值吞吐量更敏感。Kubernetes环境中的快速扩缩容、Serverless函数计算等场景OpenJ9往往比HotSpot更合适。GraalVMGraalVM是Oracle Labs推出的多语言虚拟机它的野心远不止是一个Java运行时。GraalVM包含三个核心组件Graal编译器一个用Java实现的JIT编译器可以作为HotSpot的替代编译器通过-XX:UseJVMCICompiler启用能生成质量更高的机器码GraalVM Native Image将Java程序提前编译AOT为独立的本地可执行文件启动时间从秒级降到毫秒级内存占用大幅减少Truffle框架一个用Java实现的语言实现框架基于此可以高效地实现JavaScriptGraal.js、PythonGraalPython、RubyTruffleRuby、R等语言的运行时且这些语言之间可以无缝互操作GraalVM在以下场景特别有吸引力微服务/ServerlessNative Image编译出的独立可执行文件启动极快、镜像极小多语言集成项目需要在同一应用中混用Java和Python/JS的场景高性能计算Graal编译器的逃逸分析和部分求值Partial Evaluation能力更强需要注意的是Native Image也有其局限性反射、动态代理、JNI等动态特性需要额外配置。不过随着Spring Framework从Spring Boot 3.0起对AOT编译的原生支持这个门槛已经大幅降低。Azul Zing与ZuluAzul Systems是专注于JVM优化的独立厂商提供两个核心产品Azul Zing高端商业JVM核心卖点是C4 GCContinuously Concurrent Compacting Collector。C4是一种持续并发压缩垃圾回收器即使在数百GB的大堆上也能将GC停顿控制在毫秒级。Zing的目标场景是金融交易、电信实时系统等对延迟极度敏感的应用。Azul Zulu基于OpenJDK构建的免费发行版定位类似于Adoptium原AdoptOpenJDK提供经过充分测试的二进制包和商业支持。Zulu的特点是支持平台极其广泛包括Windows、Linux、macOS和各种ARM、MIPS等架构。JVM实现关键差异对比特性维度HotSpotOpenJ9GraalVMAzul Zing默认JITC1C2分层编译JIT编译器Graal JITC1C2AOT编译jaotcJDK 9-15后移除共享类缓存AOTNative ImageReadyNow预热加速GC选项Serial/Parallel/G1/ZGC/ShenandoahGenCon/Balanced/Metronome复用HotSpot GCC4 GC核心卖点对象头大小12/16字节压缩/未压缩4/8字节更紧凑复用HotSpot复用HotSpot内存模型标准Java内存模型标准Java内存模型标准Java内存模型标准Java内存模型启动速度中等快SCCAOTNative Image模式极快中等ReadyNow优化峰值吞吐高中等偏高高Graal编译器高低延迟ZGC/ShenandoahMetronome GC复用ZGC/ShenandoahC4 GC领先平台支持主流平台主流平台主流嵌入式宽泛许可证GPL v2CEEPL 2.0 Apache 2.0GPL v2CE / 社区版免费Zing商用 / Zulu免费实践要点选择JVM实现没有银弹标准企业应用选HotSpot云原生微服务考虑OpenJ9的快速启动和低内存极限低延迟场景评估Zing的C4 GC需要合并多语言栈的项目考虑GraalVM。JDK发行版选择建议目前最主流的免费发行版是AdoptiumEclipse Temurin由Eclipse基金会背书TCK合规、多平台支持、版本覆盖全面。国内常用的阿里Dragonwell在特定场景大规模集群部署有额外优化。Oracle JDK仅在需要商业支持且预算允许时考虑。版本选择策略优先选择LTS版本JDK 8/11/17/21。JDK 8虽然广泛使用但从2019年后公开更新已停止迁移到JDK 17或JDK 21是更合理的选择。除非你需要JDK 17特有语言特性的生产力提升否则不建议在生产环境中使用非LTS版本如JDK 20/22/23等。GraalVM Native Image的适用边界Native Image适合启动速度和内存敏感的固定工作负载但不适合重度依赖反射、动态类加载的应用。评估前先用GraalVM提供的native-image-agent生成反射配置确认应用的可AOT程度。不要迷信热点代码的25%说法JIT编译阈值和优化策略在不同JVM实现上差异显著。HotSpot默认方法调用1500次触发C1编译但通过-XX:CompileThreshold可调整。微观基准测试要特别注意预热warmup否则测量的是解释执行速度而非最终性能。小结HotSpot VM经过了从Classic VM到Exact VM的漫长演进自适应优化是其核心竞争力Oracle JDK与OpenJDK从JDK 11起在技术层面几乎等价选择取决于许可证、支持和更新策略OpenJ9在启动速度和内存占用上有显著优势非常适合容器化和云原生场景GraalVM的Native Image将Java带入了AOT编译时代为微服务和Serverless开辟了新可能Azul Zing的C4 GC在极端低延迟场景下仍然难以替代JVM实现的多样性是Java生态繁荣和持续演进的重要动力更多资料【JVM调优实战】

相关新闻

【JVM调优实战】19-堆dump与线程dump分析

【JVM调优实战】19-堆dump与线程dump分析

堆 dump 与线程 dump 分析方法论 本文是《JVM调优实战》专栏第 19 讲。 引言 在前四讲中,我们走完了 JVM 诊断工具的"全景图":命令行工具(第 15 讲)、可视化工具(第 16 讲)、Arthas 在线诊断(第 17 讲)、火焰图性能分析(第 18 讲)。掌握了这些工具后,你会…

2026/7/19 22:48:53阅读更多 →
ReadCat:解锁纯净阅读体验的5个关键优势

ReadCat:解锁纯净阅读体验的5个关键优势

ReadCat:解锁纯净阅读体验的5个关键优势 【免费下载链接】read-cat 一款免费、开源、简洁、纯净、无广告的小说阅读器 项目地址: https://gitcode.com/gh_mirrors/re/read-cat 在数字阅读软件普遍被广告和付费墙包围的今天,你是否渴望一款真正专注…

2026/7/19 22:48:53阅读更多 →
视频分析终极指南:如何用AI让机器看懂视频内容

视频分析终极指南:如何用AI让机器看懂视频内容

视频分析终极指南:如何用AI让机器看懂视频内容 【免费下载链接】video-analyzer Analyze videos using LLMs, Computer Vision and Automatic Speech Recognition 项目地址: https://gitcode.com/gh_mirrors/vi/video-analyzer 你是否曾经面对海量视频内容感…

2026/7/19 22:46:53阅读更多 →
Ubuntu软件安装指南:Snap与Tar.gz对比与实践

Ubuntu软件安装指南:Snap与Tar.gz对比与实践

1. 为什么需要关注Ubuntu安装方式的选择在Ubuntu 26.04中,软件安装主要有两种主流方式:Snap和Tar.gz。这两种方式各有特点,适用于不同场景。作为长期使用Ubuntu的开发者,我发现很多新手在安装软件时常常陷入选择困难,或…

2026/7/20 13:44:45阅读更多 →
深入解析Wand-Enhancer:技术视角下的游戏增强工具架构与实践

深入解析Wand-Enhancer:技术视角下的游戏增强工具架构与实践

深入解析Wand-Enhancer:技术视角下的游戏增强工具架构与实践 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 核心关键词:Wa…

2026/7/20 13:44:45阅读更多 →
黑神话悟空实时地图插件:3分钟安装,告别迷路的终极导航方案

黑神话悟空实时地图插件:3分钟安装,告别迷路的终极导航方案

黑神话悟空实时地图插件:3分钟安装,告别迷路的终极导航方案 【免费下载链接】wukong-minimap 黑神话内置实时地图 / Black Myth: Wukong Built-in real-time map 项目地址: https://gitcode.com/gh_mirrors/wu/wukong-minimap 你是否在《黑神话&a…

2026/7/20 13:44:45阅读更多 →
Tiled:为什么这款开源瓦片地图编辑器能改变你的游戏开发方式?

Tiled:为什么这款开源瓦片地图编辑器能改变你的游戏开发方式?

Tiled:为什么这款开源瓦片地图编辑器能改变你的游戏开发方式? 【免费下载链接】tiled Flexible level editor 项目地址: https://gitcode.com/gh_mirrors/ti/tiled 你是否曾为2D游戏地图设计而陷入困境?当团队中的美术和程序员因为地图…

2026/7/20 13:44:45阅读更多 →
Linux信号产生机制:五大触发方式全解析

Linux信号产生机制:五大触发方式全解析

在Linux系统中,信号是进程间通信、系统异常处理、进程管控的核心机制,所有信号的生命周期都遵循一套固定完整的流程:信号产生 -> 信号保存 -> 信号处理。本文聚焦核心环节信号产生,全方位拆解Linux中所有信号的触发场景、底…

2026/7/20 13:44:45阅读更多 →
解决Hypack启动报错:VC++运行库依赖原理与安装修复全指南

解决Hypack启动报错:VC++运行库依赖原理与安装修复全指南

1. 项目概述:当专业软件遇上“拦路虎”搞测绘、做水文的朋友,对Hypack这个软件肯定不陌生。它几乎是内业数据处理和外业导航测量的行业标准工具之一。但很多同行,尤其是刚接触这个软件的新手,在安装Hypack时,十有八九会…

2026/7/20 13:42:45阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 0:50:54阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 0:50:54阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 0:50:54阅读更多 →
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:01:04阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:01:04阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →