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系统?


保目录结构匹配,并用完整类名启动: