我学习到的Java程序的生命周期

Java程序的生命周期主要分为5个阶段

1. 第一阶段:Java 源代码 Sample.java

  • 内容:人类可读的 Java 代码,我们日常编写的类、方法、变量都写在这里,后缀.java

2. 第二阶段:Java 编译器 javac 编译

  • 工具:javac(JDK 自带编译命令)
  • 作用:把人类可读的 Java 源码 ,编译成平台无关的字节码文件

3. 第三阶段:字节码 Sample.class

编译后生成 .class 文件,图中标注 3 个关键特性:

  1. Non-human Readable 人类不可读:二进制文件,打开是乱码,不能直接修改;
  2. Machine Independent 平台无关(Java 跨平台核心) 一份.class文件,Windows、Mac、Linux 只要安装对应系统的 JVM 就能运行,一次编译到处运行。
  3. 本质:一套统一的、给 JVM 识别的中间指令,不是操作系统原生机器码。

4. 第四阶段:JVM Java 虚拟机 解释 / 即时编译

JVM 是运行.class的载体,不同操作系统有专属版本的 JVM:

  • JVM 接收字节码后,做两件事:解释执行 + JIT 即时编译优化
  • 把统一的字节码,翻译成当前操作系统 CPU 能识别的原生二进制机器指令

5. 第五阶段:CPU 执行机器码

  • 最终产物:0/1 组成的二进制机器指令,交由电脑 CPU 直接执行,完成程序逻辑。

生命周期总结

  • Java源码 →javac静态编译→ 字节码class →JVM动态翻译→ CPU机器码

关键点

字节码不是二进制 ❌

字节码 (.class)、机器码全都是二进制文件 ,本质全是 0 和 1,只是解读主体、指令标准完全不同

  1. .class字节码:给JVM 虚拟机读的二进制指令;
  2. 机器码:给当前操作系统 CPU读的二进制指令;

字节码 ByteCode(.class 文件)关键特性

  • 统一标准,跨平台 一份Sample.class,复制到 Windows、Mac、Linux,只要装了对应系统的 JVM 就能跑。原因:字节码指令只定义 "抽象操作"(比如加载变量、调用方法、创建对象),不绑定任何 CPU 硬件。

  • 解读主体:只能被 JVM 识别,CPU 看不懂字节码

  • 查看方式:不能直接记事本读,要用命令 javap -c Sample 翻译成人类可读的助记符(比如 aload_0invokevirtual)。

机器码 Machine Code 关键特性

  1. 完全不跨平台Windows x86 的机器码,放到 Mac M 系列 ARM CPU 上直接无法识别、报错;

  2. 解读主体:CPU 直接执行,不需要中间层;

  3. 来源:由当前系统的 JVM 实时转换而来(两种方式)

    • 解释执行:JVM 逐条把字节码翻译成机器码,执行完丢弃;
    • JIT 即时编译:高频代码一次性编译成本地机器码缓存,提升速度(Java 性能核心优化)。

不同点

对比维度 字节码 .class 机器码
阅读对象 JVM 虚拟机 电脑 CPU
平台属性 跨全平台,一次编译到处运行 绑定系统 + CPU,无法跨平台
生成时机 开发阶段:javac 提前静态编译 运行阶段:JVM 实时动态转换生成
指令作用 抽象逻辑(创建对象、调用方法) 硬件底层操作(寄存器读写、内存寻址)

前端专属通俗举例帮你吃透

把 JVM 想象成浏览器:

  1. Java 源码 = TS 代码
  2. 字节码 = TS 编译后的统一中间字节码(所有浏览器通用)
  3. 机器码 = 浏览器 V8 把中间字节码,转成你电脑 CPU 专属指令

总结

  1. Java 跨平台靠的是字节码 + 多系统适配的 JVM,不是机器码;
  2. 字节码、机器码都是二进制,区别只是 "给谁看";
  3. 编译分两段:开发期静态编译出字节码,运行期 JVM 动态转机器码。
相关推荐
许彰午几秒前
14-字段级SM4加密与SM2签名
java·低代码·架构
MC皮蛋侠客7 分钟前
Tauri 2.x 系列(五):调用系统 API——官方插件、Rust crate 与原生能力
开发语言·后端·rust
许彰午1 小时前
13-describe元数据输出
java·低代码·架构·状态模式
Profile排查笔记2 小时前
指纹浏览器怎么设置 IP?代理配置、检测与排错流程
前端·人工智能·后端·自动化
用户3721574261352 小时前
Java 设置 Word 文档编辑限制并允许指定区域编辑
java
宠友信息3 小时前
社区类源码开发实践中的仿小红书系统技术要点分析
java·spring boot·redis·mysql·uni-app·vue·内容运营
IT_陈寒3 小时前
SpringBoot自动配置失效?你可能漏了这个小开关
前端·人工智能·后端
用户3721574261353 小时前
Java 设置 PDF 表单域只读或扁平化
java
摇滚侠3 小时前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 1
spring boot·笔记·后端
用户8356290780514 小时前
使用 Python 在 Excel 中插入 OLE 对象
后端·python