登录
首页 >  文章 >  java教程

Java程序运行流程全解析

时间:2026-01-01 19:02:46 201浏览 收藏

文章小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《Java程序执行过程详解》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


Java程序需先经javac编译为平台无关字节码(.class),再由JVM加载、链接、初始化并执行;编译与运行分属独立阶段,各有类路径、版本及错误约束。

Java程序是如何被执行的_Java编译与运行流程说明

Java 程序不是直接被 CPU 执行的,它必须先经过 javac 编译成字节码(.class 文件),再由 JVM 加载并解释/编译执行。

javac 编译:源码 → 字节码

Java 源文件(.java)不能被操作系统直接运行。必须用 javac 将其翻译为 JVM 能识别的二进制字节码(.class)。

  • javac 不生成机器码,只生成平台无关的字节码;同一份 .class 可在 Windows、Linux、macOS 的任意兼容 JVM 上运行
  • 编译时若引用了外部类(如 import java.util.List),javac 仅检查语法和符号存在性,不校验运行时行为
  • 默认不生成调试信息(如源码行号、局部变量名),加 -g 参数可保留,对排查 Exception 堆栈有用
  • 常见错误:error: class XXX is public, should be declared in a file named XXX.java —— 公有类名必须与文件名完全一致(大小写敏感)

java 命令:加载、链接、初始化、执行

运行阶段由 java 命令触发,背后是 JVM 完成类加载、验证、准备、解析、初始化五步,最终调用 main 方法。

  • 入口类必须含 public static void main(String[] args) 方法,且类名需与 .class 文件名一致(区分大小写)
  • JVM 默认从 CLASSPATH 查找类;若类在包中(如 com.example.App),需确保目录结构匹配,并用完整类名启动:java com.example.App
  • 若出现 Exception in thread "main" java.lang.NoClassDefFoundError: XXX,通常是类路径缺失、类名拼错、或静态初始化块抛异常导致类加载失败
  • java -verbose:class 可观察哪些类被加载,适合排查类冲突或双亲委派问题

字节码不是万能的:版本兼容陷阱

不同 JDK 版本生成的字节码有主版本号(major version),高版本 JVM 可运行低版本字节码,但反过来会报错。

  • 编译时指定目标版本:javac -source 8 -target 8 Hello.java,避免在旧 JVM 上运行时报 UnsupportedClassVersionError
  • 查看 .class 文件版本:javap -verbose Hello.class | grep "major"
  • JDK 17+ 默认启用 --enable-preview 相关特性需显式开启,否则即使编译通过,运行时也会抛 UnsupportedOperationException

JIT 编译器:运行时的二次优化

JVM 启动后并非全程解释执行字节码。HotSpot VM 会在运行时识别热点方法,用 JIT(Just-In-Time)编译器将其编译为本地机器码,提升性能。

  • 这个过程对开发者透明,但会影响性能分析:首次调用慢(解释执行),多次调用后变快(JIT 编译后)
  • 可通过 -XX:+PrintCompilation 查看哪些方法被 JIT 编译
  • JIT 优化依赖运行时数据(如分支走向、对象分配模式),所以压测环境的 JIT 行为可能和生产不一致
  • 注意:AOT(Ahead-of-Time)编译(如 jaotc)在 JDK 16+ 已弃用,当前主流仍是 JIT

真正容易被忽略的是:编译和运行是两个独立阶段,各自有独立的类路径、版本约束和错误模型。一次 javac 成功,不代表 java 一定能跑起来;而一个看似“运行成功”的程序,也可能因 JIT 未覆盖关键路径,在高并发下暴露出性能拐点。

好了,本文到此结束,带大家了解了《Java程序运行流程全解析》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>