讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

在Java里程序是如何被编译和执行的_Java执行流程解析

梦丽姑娘_8143

梦丽姑娘_8143

发布时间:2026-01-29 08:26:03

|

710人浏览过

|

来源于php中文网

原创

Java源代码通过javac编译为.class字节码文件,该过程不生成机器码、无需链接,故跨平台;需确保类名与文件名严格一致,依赖文件需手动指定或用-sourcepath,输出目录用-d控制。

在java里程序是如何被编译和执行的_java执行流程解析

Java源代码怎么变成.class文件

Java程序的编译由javac完成,它把.java文件翻译成JVM能识别的字节码(.class文件),不是直接转为机器码。这个过程不涉及链接或平台适配,所以编译结果是跨平台的。

常见错误:javac HelloWorld.java报错“找不到符号”,大概率是类名和文件名不一致——public class HelloWorld必须保存在HelloWorld.java中,大小写也必须完全匹配。

  • javac默认只编译指定文件,不会自动编译其依赖的其他.java文件;有依赖时得手动列全,或用-sourcepath指定源码路径
  • 编译输出目录可用-d控制,例如javac -d ./out src/HelloWorld.java,否则.class会生成在当前目录,容易混乱
  • Java 14+ 默认启用--enable-preview特性需显式加参数,否则新语法(如record)会编译失败

JVM如何加载并运行.class文件

执行阶段由java命令触发,它启动JVM,再由类加载器(ClassLoader)按需读取.class字节码,经过验证、准备、解析、初始化后进入运行时数据区。注意:这里不重新编译,也不检查源码是否存在。

典型问题:java HelloWorld报错Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld,往往不是没编译,而是类路径不对——JVM找不到HelloWorld.class,尤其当它在子目录或-d指定了输出目录时。

立即学习“Java免费学习笔记(深入)”;

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载
  • 运行时必须用类名(不含.class后缀),且区分包结构;例如com.example.Hello要放在com/example/Hello.class路径下,并用java -cp . com.example.Hello
  • java默认只查当前目录和CLASSPATH环境变量,不自动包含./out或src等目录
  • 如果类依赖第三方jar,必须用-cp或--class-path显式引入,例如java -cp ".:lib/gson.jar" Main(Linux/macOS)或java -cp ".;lib/gson.jar" Main(Windows)

从字节码到机器指令发生了什么

JVM不直接执行字节码,而是通过解释器逐行翻译,或在热点代码处用JIT编译器(如HotSpot的C1/C2)编译为本地机器码。这个过程对开发者透明,但影响实际性能表现。

容易被忽略的一点:JIT优化基于运行时行为,所以同一段代码在不同负载、不同JVM参数下,执行效率可能差异很大。比如-XX:+TieredStopAtLevel=1会禁用C2编译,强制只用C1,适合调试但性能下降明显。

  • 可通过-XX:+PrintCompilation看到哪些方法被JIT编译了
  • -Xcomp强制所有方法首次执行就编译(跳过解释阶段),但启动更慢,且未必提升整体吞吐
  • Java 9+ 的jshell是独立于标准JVM流程的REPL环境,它内部仍走编译→字节码→JVM加载链路,只是隐藏了文件落地步骤

为什么修改.java后不重新运行就看不到效果

因为java命令只读.class,不关联源码。改完.java必须重新javac,否则运行的还是旧字节码。IDE通常自动做这一步,但命令行里极易遗漏。

另一个陷阱:有些构建工具(如Maven)默认使用target/classes里的字节码,而你手动javac生成在当前目录,导致mvn exec:java运行的是旧版本。

  • 确认正在运行的字节码来源:用java -verbose:class HelloWorld 2>&1 | grep HelloWorld看JVM实际加载的是哪个路径下的类
  • 清理残留.class最稳妥的方式是删掉整个输出目录(如rm -rf out/或del /s/q out\),而不是只删某个文件
  • Java 11+ 的java HelloWorld.java(直接运行源文件)是特殊语法糖,底层仍会隐式调用javac并缓存字节码到临时目录,但仅限单文件且无依赖场景
字节码和JVM之间的衔接是静态的,但JIT和类加载时机是动态的;很多“运行结果不符预期”的问题,其实卡在编译路径、类路径、或JIT尚未介入的早期执行阶段。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

4640

2025.09.15

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

389

2026.05.09

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

4576

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

326

2025.12.06

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

603

2025.12.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3459

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3018

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1548

2023.08.01

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

80

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn