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在运行时动态加载类的机制,确保类的正确性。
  • 运行是字节码的实际执行,处理程序逻辑和异常。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【KWDB 创作者计划】_深度学习篇---松科AI加速棒

文章目录 前言一、简介二、安装与配置硬件连接驱动安装软件环境配置三、使用步骤初始化设备调用SDK接口检测设备状态:集成到AI项目四、注意事项兼容性散热固件更新安全移除五、硬件架构与技术规格核心芯片专用AI处理器内存配置接口类型物理接口虚拟接口能效比散热设计六、软件…

如何清理Windows系统中已失效或已删除应用的默认打开方式设置

在使用Windows系统的过程中,我们可能会遇到一些问题:某些已卸载或失效的应用程序仍然出现在默认打开方式的列表中,这不仅显得杂乱,还可能影响我们快速找到正确的程序来打开文件。 如图,显示应用已经被geek强制删除&am…

NFC碰一碰发视频推广工具开发注意事项丨支持OEM搭建

随着线下门店短视频推广需求的爆发,基于NFC技术的“碰一碰发视频”推广工具成为商业热点。集星引擎在开发同类系统时,总结出六大核心开发注意事项,帮助技术团队与品牌方少走弯路,打造真正贴合商户需求的实用型工具: 一…

pgsql中使用jsonb的mybatis-plus和Spring Data JPA的配置

在pgsql中使用jsonb类型的数据时,实体对象要对其进行一些相关的配置,而mybatis和jpa中使用各不相同。 在项目中经常会结合 MyBatis-Plus 和 JPA 进行开发,MyBatis_plus对于操作数据更灵活,jpa可以自动建表,两者各取其…

kotlin + spirngboot3 + spring security6 配置登录与JWT

1. 导包 implementation("com.auth0:java-jwt:3.14.0") implementation("org.springframework.boot:spring-boot-starter-security")配置用户实体类 Entity Table(name "users") data class User(IdGeneratedValue(strategy GenerationType.I…

【JavaWeb后端开发03】MySQL入门

文章目录 1. 前言1.1 引言1.2 相关概念 2. MySQL概述2.1 安装2.2 连接2.2.1 介绍2.2.2 企业使用方式(了解) 2.3 数据模型2.3.1 **关系型数据库(RDBMS)**2.3.2 数据模型 3. SQL语句3.1 DDL语句3.1.1 数据库操作3.1.1.1 查询数据库3.1.1.2 创建数据库3.1.1…

人工智能在智能家居中的应用与发展

随着人工智能(AI)技术的飞速发展,智能家居逐渐成为现代生活的重要组成部分。从智能语音助手到智能家电,AI正在改变我们与家居环境的互动方式,让生活更加便捷、舒适和高效。本文将探讨人工智能在智能家居中的应用现状、…

【EasyPan】项目常见问题解答(自用持续更新中…)

EasyPan 网盘项目介绍 一、项目概述 EasyPan 是一个基于 Vue3 SpringBoot 的网盘系统,支持文件存储、在线预览、分享协作及后台管理,技术栈涵盖主流前后端框架及中间件(MySQL、Redis、FFmpeg)。 二、核心功能模块 用户认证 注册…

4.1腾讯校招简历优化与自我介绍攻略:公式化表达+结构化呈现

腾讯校招简历优化与自我介绍攻略:公式化表达结构化呈现 在腾讯校招中,简历是敲开面试大门的第一块砖,自我介绍则是展现个人魅力的黄金30秒。本文结合腾讯面试官偏好,拆解简历撰写公式、自我介绍黄金结构及分岗位避坑指南&#xf…

【Easylive】consumes = MediaType.MULTIPART_FORM_DATA_VALUE 与 @RequestPart

【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 consumes MediaType.MULTIPART_FORM_DATA_VALUE 的作用 1. 定义请求的数据格式 • 作用:告诉 Feign 和 HTTP 客户端,这个接口 接收的是 multipart/form-data 格式的…

OpenSSL1.1.1d windows安装包资源使用

环境: QT版本:5.14.2 用途: openssl1.1.1d版本 问题描述: 今天尝试用百度云人脸识别api搭载QT的人脸识别程序,需要用到 QNetworkManager 访问 https 开头的网址。 但是遇到了QT缺乏 openssl 的相关问题,找了大半天…

代码实战保险花销预测

文章目录 摘要项目地址实战代码(初级版)实战代码(进阶版) 摘要 本文介绍了一个完整的机器学习流程项目,重点涵盖了多元线性回归的建模与评估方法。项目详细讲解了特征工程中的多项实用技巧,包括&#xff1…

RS232 串行通信:C++ 实现指南

文章目录 一、RS232 简介1. 电气特性2. 传输速率3. 传输距离 二、在 C 中实现 RS232 通信1. Windows 平台(1)打开串行端口(2)配置串行通信参数(3)发送数据(4)接收数据(5&…

Linux指令合集

一、VI的使用 命令行模式:默认此模式,从输入模式回到命令行模式:esc , esc按完,insert消失 输入模式:按 i 进入 , 看到insert就能编辑代码 退出vi 保存代码 命令行模式下 按&#xf…

IDEA使用jclasslib Bytecode Viewer查看jvm字节码

学习jvm的时候,想查看字节码和局部变量表,可以使用idea安装jclasslib Bytecode View插件查看。 (1)安装工具: 安装完成后需要重启idea. (2)准备一段代码,编译运行 package com.te…

从多个Excel批量筛查数据后合并到一起

这篇文章将讲解如何批量的从多个Excel文件中筛选出需要的数据,最后合并到一张新的Excel。 全程0代码图形化界面操作。 准备数据 这里准备了3个测试文件,每个文件的格式是一样的 现在我们需要筛选出每个文件里面,基金简称包含“南方远见”&a…

Debian GNU/Linux的新手入门介绍

Debian GNU/Linux:起源、基本介绍与发行版对比 一、起源与发展历程 Debian GNU/Linux 是现存最古老的 Linux 发行版之一,由 Ian Murdock 于 1993 年 8 月 16 日创立。其名称结合了他的女友(后成为妻子)Debra 和他自己的名字 Ian…

Sentinel源码—7.参数限流和注解的实现一

大纲 1.参数限流的原理和源码 2.SentinelResource注解的使用和实现 1.参数限流的原理和源码 (1)参数限流规则ParamFlowRule的配置Demo (2)ParamFlowSlot根据参数限流规则验证请求 (1)参数限流规则ParamFlowRule的配置Demo 一.参数限流的应用场景 二.参数限流规则的属性 …

多数据源配置(MyBatis-Plus vs AbstractRoutingDataSource)

MyBatis-Plus vs AbstractRoutingDataSource MyBatis-Plus多数据源配 1.添加依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> <…

聊透多线程编程-线程互斥与同步-13. C# Mutex类实现线程互斥

目录 一、什么是临界区&#xff1f; 二、Mutex类简介 三、Mutex的基本用法 解释&#xff1a; 四、Mutex的工作原理 五、使用示例1-保护共享资源 解释&#xff1a; 六、使用示例2-跨进程同步 示例场景 1. 进程A - 主进程 2. 进程B - 第二个进程 输出结果 ProcessA …