【JVM原理详解】01-从一次编写到处运行到JVM
从一次编写到处运行到JVM引言“Write Once, Run Anywhere”WORA是Java诞生之初最响亮的口号也是Java能够迅速占领企业级开发市场的核心武器。但这句话背后究竟隐藏着怎样的技术机制为什么C/C做不到的事情Java却能实现本篇将从Java程序的完整生命周期出发深入剖析字节码在其中的关键角色带你理解JVM如何作为一座桥梁连接起源码与不同操作系统之间的鸿沟。Java程序的编译与执行全景Java程序的执行经历了一条精心设计的流水线每一步都承担着不可或缺的职责。整体流程可以分为三个核心阶段阶段一源码到字节码编译阶段Java源码文件.java通过javac编译器被转换成字节码文件.class。这个阶段在我们日常开发中通常由IDE自动完成但它所生成的产物——字节码——才是Java跨平台的真正秘密。字节码不是针对任何特定CPU的机器指令而是一种面向JVM的通用指令集。它独立于底层操作系统和硬件架构使得同一份.class文件可以在任何安装了JVM的平台上运行。阶段二字节码到JVM内部表示加载阶段当程序运行时JVM的类加载器子系统Class Loader Subsystem负责将.class文件加载到内存中同时进行链接验证、准备、解析和初始化操作。这个过程不仅将字节码纳入JVM的管理范围还确保了加载的类符合JVM规范的安全要求例如防止非法的类型转换和内存访问。阶段三JVM内部表示到机器码执行阶段JVM的执行引擎Execution Engine负责将字节码翻译为本地机器指令。这一过程在HotSpot VM中采用解释执行与即时编译JIT混合的模式程序启动时先用解释器快速开始执行同时监控热点代码当某段代码被频繁调用达到阈值时触发JIT编译器将其编译为高效的本地机器码。这种混合策略兼顾了启动速度与运行时性能。字节码跨平台的中间表示.class文件是Java跨平台机制的核心。它不是简单的文本而是一种严格按照《Java虚拟机规范》定义的二进制格式。每个.class文件都包含以下关键信息魔数Magic Number0xCAFEBABE用于标识这是一个合法的Java字节码文件版本号标识该类文件兼容的JVM版本范围常量池Constant Pool存储类中使用的所有字面量和符号引用访问标志标识类是public、abstract、interface等字段表与方法表记录字段和方法的签名信息属性表存储额外的调试信息、注解等我们可以通过JDK自带的javap工具反编译字节码文件直观地观察字节码指令。这种设计带来了多方面的优势平台无关性字节码指令集是抽象的不依赖任何特定的CPU指令集如x86、ARM安全校验JVM在加载字节码时会进行字节码验证检查指令的操作数类型是否合法、控制流是否合理从而防止恶意代码破坏JVM内存动态优化因为字节码提供了高层次的语义信息JIT编译器可以进行更深层次的优化比如内联和逃逸分析JVM规范与实现的关系很多开发者容易混淆JVM规范和JVM实现这两个概念。它们的关系类似于接口与实现类。JVM规范The Java Virtual Machine Specification定义了JVM必须满足的行为标准包括class文件格式的精确布局JVM指令集的语义约200余条指令如aload_0、invokevirtual运行时数据区域的逻辑结构类加载和链接的流程垃圾回收的基本要求JVM实现则是具体的软件产品只要它遵循JVM规范任何厂商都可以开发自己的JVM。这使得Java生态中涌现出多样化的JVM选项实现开发者特点HotSpot VMOracle/OpenJDK最主流的实现同时使用解释器和JIT编译器OpenJ9Eclipse基金会原IBM J9启动快、内存占用低适合云原生场景GraalVMOracle Labs支持多语言Java、JS、Python等混编AOT编译能力强Azul ZingAzul Systems采用C4 GC算法适合大堆、低延迟场景尽管实现各不相同但只要符合JVM规范同一个.class文件就能够在所有这些JVM上运行。这种规范和实现分离的设计正是Java生态繁荣的底层基础。跨平台机制的底层原理当JVM启动一个Java程序时究竟发生了什么让我们追踪java HelloWorld这条命令的完整执行路径JVM进程启动操作系统创建一个本地进程JVM启动器加载对应平台的JVM动态库Linux上是libjvm.soWindows上是jvm.dll类加载JVM通过AppClassLoader搜索classpath找到HelloWorld.class文件读取其二进制内容到内存字节码验证与链接JVM验证字节码的合法性解析符号引用为直接引用分配静态变量内存并执行静态初始化执行引擎介入找到main方法后JVM从第一条字节码指令开始解释执行。HotSpot采用模板解释器——每条字节码指令都对应一段预生成的机器码片段stub解释器通过查表跳转到对应的stub完成执行JIT编译介入当main方法中的某段循环代码被执行超过热点阈值默认为1500次方法调用或10000次回边计数C1编译器Client Compiler迅速生成优化程度适中的机器码。如果这段代码持续处于热点C2编译器Server Compiler将进行更深层次的优化跨平台的关键在于字节码指令到机器指令的翻译逻辑是平台相关的但翻译的目标是相同的字节码。在Linux x86-64上iconst_1被翻译为mov eax, 1在ARM架构上同样的iconst_1被翻译为mov r0, #1。上层的Java代码和字节码完全不知道这些底层差异。代码示例示例一javac编译与字节码查看// HelloWorld.java - JDK 8/11/17 均适用publicclassHelloWorld{publicstaticvoidmain(String[]args){intx10;inty20;intsumadd(x,y);System.out.println(Sum sum);}publicstaticintadd(inta,intb){// 简单的加法后续JIT编译器会将其内联returnab;}}编译并查看字节码# 编译javac HelloWorld.java# 查看人类可读的字节码带行号和常量池javap-c-verboseHelloWorld.classjavap -c输出的关键部分public static int add(int, int); Code: 0: iload_0 // 将第一个参数压栈 1: iload_1 // 将第二个参数压栈 2: iadd // 弹出两个int求和处理 3: ireturn // 返回结果可以看到Java源码中的a b被编译为三条JVM指令iload_0、iload_1、iadd。这些指令在任意平台的JVM上具有完全相同的语义但底层翻译成的机器指令则因平台而异。示例二观察JIT编译效果以下代码通过-XX:PrintCompilation参数可以观察到JIT编译器的工作// JITWatch.java - 观察JIT编译行为publicclassJITWatch{publicstaticvoidmain(String[]args){longstartSystem.nanoTime();// 循环体被反复执行会触发JIT编译for(inti0;i100_000;i){hotMethod();}longendSystem.nanoTime();System.out.println(耗时: (end-start)/1_000_000 ms);}// 这个方法最初被解释执行达到阈值后被JIT编译为机器码publicstaticvoidhotMethod(){intresult0;for(inti0;i100;i){resulti*i;}}}运行观察JIT编译日志# JDK 8 - 注意分层编译是JDK 7后的默认行为java-XX:PrintCompilationJITWatch# JDK 17 - 使用统一的日志框架java-XX:PrintCompilationJITWatch输出中会看到带百分号的编译任务条目表示该方法被JIT编译。随着时间推移热点方法从解释执行切换为编译执行性能显著提升——这正是HotSpot得名的原因。实践要点编译版本兼容性javac默认生成与当前JDK版本一致的class文件。若需兼容旧版本JVM使用-source和-target参数。JDK 9引入的--release参数同时控制API版本和字节码版本是更可靠的选择。例如javac --release 8 HelloWorld.javajar包和class文件的跨平台性jar包本质上就是ZIP格式的压缩包包含class文件和相关资源。只要目标平台安装了兼容版本的JRE/JDKjar包就可以直接运行。这也是Docker镜像中Java应用层可以做到一次构建、多平台部署的前提。JNI打破跨平台如果Java程序使用了JNIJava Native Interface调用本地C/C代码跨平台能力将受到限制。本地库.so、.dll、.dylib必须为每个目标平台单独编译。在架构设计时应优先考虑纯Java方案仅在无法避免时使用JNI。字节码版本陷阱class文件的major版本号决定其能否在特定JVM上运行。常见对应关系major 52→JDK 8、major 55→JDK 11、major 61→JDK 17。当遇到UnsupportedClassVersionError异常时检查编译和运行环境的JDK版本差异。性能权衡虽然在所有平台上都能运行但不同平台上的JVM实现在性能特征上有所差异。例如在容器化环境中JDK 8u191之前的版本无法正确识别cgroup内存限制可能导致OOM。生产部署时应验证目标平台的JVM行为。小结WORA的本质是通过字节码作为中间表示将Java源码与底层平台解耦由JVM在各平台上完成字节码到机器码的转换字节码是严格遵循JVM规范的二进制格式javap是理解字节码最直接的工具JVM规范与实现分离的架构使得同一套字节码可以运行在HotSpot、OpenJ9、GraalVM等不同实现上形成了繁荣的JVM生态解释执行与JIT编译混合的模式在启动速度和峰值性能之间取得了动态平衡是HotSpot VM的核心竞争力理解这套跨平台机制是深入掌握JVM调优、类加载机制和执行引擎优化的前提也是下一篇文章要展开讨论的JVM整体架构基础

相关新闻

大模型二面被问:你那么多skill怎么做版本管理?我说保存为多个文件夹。他说:那你怎么知道每个版本的区别呢,skill多起来你会抓狂的…

大模型二面被问:你那么多skill怎么做版本管理?我说保存为多个文件夹。他说:那你怎么知道每个版本的区别呢,skill多起来你会抓狂的…

上周有个粉丝去面大模型,二面聊到大模型应用开发,面试官问了一个他觉得"不怎么重要"的问题:“你项目里用了不少 Skill,怎么做版本管理的?” 他当时愣了一下,心想这又不是写代码,版本…

2026/10/18 6:07:19 阅读更多 →
《HarmonyOS技术精讲-Basic Services Kit》USB服务:设备发现与通信

《HarmonyOS技术精讲-Basic Services Kit》USB服务:设备发现与通信

《HarmonyOS技术精讲-Basic Services Kit(基础服务)》USB服务:设备发现与通信USB服务是HarmonyOS Basic Services Kit中经常被误解的一个模块。很多人以为接上U盘就能直接用fileIO读文件,但应用沙箱机制并不允许直接访问外部存储。…

2026/10/18 6:07:26 阅读更多 →
OpenClaw衍生:NullClaw、GoClaw、openJiuwen、LingClaw、MateClaw

OpenClaw衍生:NullClaw、GoClaw、openJiuwen、LingClaw、MateClaw

关于OpenClaw的项目,请参考: OpenClaw相关项目:Awesome系列、PicoClaw、ClawWork、ClawX、MetaClaw、OpenClawInstaller、Clawra、MicroClaw、OneClawOpenClaw相关开源项目:ZeroClaw、IronClaw、MoltWorker、clawdbot-feishu、Lo…

2026/10/18 6:07:29 阅读更多 →

最新新闻

2019年CSP-S初赛选择题1-5题精讲:进制、位运算、栈、二叉树与KMP陷阱全解析

2019年CSP-S初赛选择题1-5题精讲:进制、位运算、栈、二叉树与KMP陷阱全解析

2019年的CSP-S初赛,是我第一次以“CSP”而不是“NOIP”的名义走进考场。说实话,当时心里多少有点没底——毕竟是新名字的第一年,谁也不知道命题风格会不会大改。等我翻到选择题第一页,看到前5题的时候反而松了口气:进制…

2026/10/19 3:15:05 阅读更多 →
腾讯云文本审核工具类封装实践:从SDK调用到一行接入

腾讯云文本审核工具类封装实践:从SDK调用到一行接入

做后端这几年,涉及用户输入的场景就没断过——评论、弹幕、私信、AI对话、论坛发帖,几乎每个能提交文字的地方都得过一道内容安全检查。一开始我也图省事,想着审核就审核,直接在业务代码里new一个请求对象,调一下腾讯云…

2026/10/19 3:15:05 阅读更多 →
神龙汽车新春守护直播:车企节点型用户关系运营如何落地

神龙汽车新春守护直播:车企节点型用户关系运营如何落地

看到“知音相伴 一路同行|神龙汽车‘新春守护暖心发布’专场直播即将温情启幕”这个标题时,我第一反应是:这不只是一场普通的车企直播预告,而是一个典型的“节点型用户关系运营”样本。作为一个常年做汽车品牌营销和直播策划的人&…

2026/10/19 3:15:05 阅读更多 →
JSON-RPC 2.0实战:Python实现、TCP/HTTP接入与避坑指南

JSON-RPC 2.0实战:Python实现、TCP/HTTP接入与避坑指南

简介:jsonRPC.rar是一份面向Java Web开发者的JSON-RPC入门案例资源包,集中演示了轻量级远程调用协议的基本原理与实现方式,解决分布式服务通信及前后端API交互场景中的实际搭建问题。资源共35个文件,包含25个jar依赖库&#xff08…

2026/10/19 3:15:05 阅读更多 →
TTHHO优化RBF神经网络参数:分类预测准确率突破91%的实战解析

TTHHO优化RBF神经网络参数:分类预测准确率突破91%的实战解析

如果你手头有一个分类任务,先试了试直接训练径向基函数网络(RBF),结果测试集准确率卡在八成出头再也上不去,你大概率会怀疑:是不是数据没处理好?特征选择有问题?我告诉你&#xff0c…

2026/10/19 3:15:04 阅读更多 →
Flink有界流与无界流:核心区别、运行时行为差异与选型避坑指南

Flink有界流与无界流:核心区别、运行时行为差异与选型避坑指南

1. 从一个反直觉的现象说起:为什么批处理跑得好好的,换成流处理就出问题刚接触 Flink 的人,十有八九会在某个时刻被一个看似简单的问题绊住:我明明写的是同一套算子逻辑,为什么换成流模式跑,结果要么迟迟不…

2026/10/19 3:14:03 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →