当前位置: 首页 > news >正文

Java中 关于编译(Compilation)、类加载(Class Loading) 和 运行(Execution)的详细区别解析

以下是Java中 编译(Compilation)类加载(Class Loading)运行(Execution) 的详细区别解析:


1. 编译(Compilation)

定义

将Java源代码(.java文件)转换为字节码(.class文件)的过程,由javac编译器完成。

关键特点
  • 发生时间:程序运行前(开发阶段)。
  • 输入/输出:输入是.java文件,输出是.class文件(包含JVM可执行的字节码)。
  • 核心任务
    • 语法检查(如类型错误、语法错误)。
    • 优化代码结构(如常量折叠、死代码消除)。
  • 示例
    javac Main.java  # 编译生成 Main.class
    
常见错误
  • 编译错误:如缺少分号、未定义的变量、类型不匹配等。
    int x = "hello"; // 编译错误:类型不兼容
    

2. 类加载(Class Loading)

定义

JVM在运行时.class文件加载到内存,并进行验证、准备、解析和初始化的过程。

关键特点
  • 发生时间:程序运行时(按需加载)。
  • 核心步骤
    1. 加载(Loading):查找并加载类的二进制数据。
    2. 链接(Linking)
      • 验证(Verification):确保字节码符合JVM规范。
      • 准备(Preparation):为静态变量分配内存并赋默认值(如int初始化为0)。
      • 解析(Resolution):将符号引用转换为直接引用。
    3. 初始化(Initialization):执行静态代码块和静态变量的显式赋值。
  • 触发条件
    • 首次创建类的实例。
    • 首次访问类的静态成员。
    • 通过反射(如Class.forName("ClassName"))。
常见错误
  • 加载阶段ClassNotFoundException(找不到类文件)。
  • 验证阶段VerifyError(字节码不合法)。
  • 初始化阶段ExceptionInInitializerError(静态块抛出异常)。

3. 运行(Execution)

定义

JVM解释或即时编译(JIT)字节码,执行程序的逻辑。

关键特点
  • 发生时间:类加载完成后,由JVM执行引擎处理。
  • 核心机制
    • 解释执行:逐行解释字节码(启动快,执行慢)。
    • JIT编译:将热点代码编译为本地机器码(执行快,占用内存)。
  • 输入:已加载到内存的字节码。
  • 输出:程序的实际运行结果。
常见错误
  • 运行时异常:如NullPointerExceptionArrayIndexOutOfBoundsException
  • 逻辑错误:代码功能不符合预期(如死循环)。

三者的区别总结

维度编译类加载运行
发生时间程序运行前(开发阶段)运行时(按需加载)运行时(类加载完成后)
主要工具/机制javac编译器JVM的类加载器(Bootstrap、Ext、App)JVM执行引擎(解释器、JIT)
核心任务生成字节码,检查语法错误加载、链接、初始化类执行字节码,处理业务逻辑
错误类型语法错误、类型不匹配ClassNotFoundExceptionNoClassDefFoundErrorNullPointerException、逻辑错误

示例流程

  1. 编写代码

    // Main.java
    public class Main {static { System.out.println("静态块初始化"); }public static void main(String[] args) {System.out.println("Hello World");}
    }
    
  2. 编译

    javac Main.java  # 生成 Main.class
    
  3. 类加载(运行java Main时):

    • 加载Main.class
    • 链接(验证、准备静态变量)。
    • 初始化(执行静态块,输出静态块初始化)。
  4. 运行

    • 执行main方法,输出Hello World

总结

  • 编译是代码到字节码的转换,解决语法问题。
  • 类加载是JVM在运行时动态加载类的机制,确保类的正确性。
  • 运行是字节码的实际执行,处理程序逻辑和异常。

理解这三者的区别,能帮助开发者更好地调试程序(如区分编译错误和运行时错误),并优化类加载机制(如减少启动时间)。

相关文章:

  • vue3数据响应式丢失的情况有哪些
  • 极狐GitLab CEO 柳钢受邀出席 2025 全球机器学习技术大会
  • 大语言模型提示词工程详尽实战指南
  • 【计网】三四章习题
  • Linux-编辑器的使用
  • 【Linux】线程安全与线程同步
  • 单页面应用的特点,什么是路由,VueRouter的下载,安装和使用,路由的封装抽离,声明式导航的介绍和使用
  • 【Easylive】为什么需要手动转换 feign.Response 到 HttpServletResponse
  • 关于 梯度下降算法、线性回归模型、梯度下降训练线性回归、线性回归的其他训练算法 以及 回归模型分类 的详细说明
  • Dify忘记管理员密码,重置的问题
  • ADB -> pull指令拉取手机文件到电脑上
  • 【图像标注技巧】目标检测图像标注技巧
  • elastic/go-elasticsearch与olivere/elastic
  • 如何建设企业级合成数据中台?架构设计、权限治理与复用机制全解
  • 通过Docker Desktop配置OpenGauss数据库的方法(详细版+图文结合)
  • 特征选择与类不平衡处理
  • ThinkPHP5 的 SQL 注入漏洞
  • 041-代码味道-大泥团模块
  • VSCode连接服务器跑深度学习代码相关问题(研0大模型学习第八天)
  • C++入门小馆: 深入string类(二)
  • 大卫·第艾维瑞谈历史学与社会理论②丨马克斯·韦伯与历史学研究
  • 执政将满百日,特朗普政府面临国内“三重暴击”
  • 动力电池、风光电设备退役潮来袭,国家队即将推出“再生计划”
  • 从 “负分” 到世界杯亚军,蒯曼专打“逆风局”
  • “雷公”起诉人贩子王浩文案将开庭:索赔6元,“讨个公道”
  • 电子产品已拆封,还能申请“七天无理由退货”吗?上海法院这样判