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

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

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 未覆盖关键路径,在高并发下暴露出性能拐点。


# linux  # java  # windows  # 操作系统  # app  # 字节  # mac  #   # ai  # macos  # win  # 热点  # cos  # red 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel集合Collection怎么用_Laravel集合常用函数详解  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Laravel如何使用模型观察者?(Observer代码示例)  zabbix利用python脚本发送报警邮件的方法  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  青岛网站建设如何选择本地服务器?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  JavaScript如何实现继承_有哪些常用方法  实例解析angularjs的filter过滤器  Laravel如何创建自定义中间件?(Middleware代码示例)  MySQL查询结果复制到新表的方法(更新、插入)  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  JavaScript Ajax实现异步通信  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何为API生成Swagger或OpenAPI文档  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  网站制作报价单模板图片,小松挖机官方网站报价?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel怎么为数据库表字段添加索引以优化查询  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何在香港免费服务器上快速搭建网站?  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  装修招标网站设计制作流程,装修招标流程?  如何用PHP快速搭建CMS系统?