【Java代码的运行过程】 ——每天一点小知识

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【Java代码的运行过程】 ——每天一点小知识

Java代码的运行过程

   💧在Java中,当我们运行一个Java程序时,它会经历以下过程:链接初始化类加载双亲委派机制。让我们逐步了解每个过程的含义和作用。

🌊链接

   链接是将Java源代码转换为可执行代码的过程。它分为三个阶段:


💧验证(Verification):在这个阶段,Java虚拟机(JVM)将检查字节码的合法性和安全性,以确保它不会对系统造成损害。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证。


💧准备(Preparation):在准备阶段,JVM为类的静态变量分配内存,并设置默认的初始值。这些变量在此阶段被赋予默认值,如整数类型的变量赋值为0,引用类型的变量赋值为null。


💧解析(Resolution):在解析阶段,符号引用被解析为直接引用。符号引用是指用名称来引用类、方法、字段等的方式,而直接引用是指内存地址或偏移量等具体的指针。解析过程可以在编译时进行,也可以在运行时进行。


🌊初始化

  初始化是Java类加载过程的最后一步。当一个类被首次主动使用时,它将被初始化。初始化阶段主要完成以下任务:


💧静态变量赋值:将静态变量按照代码中的赋值语句进行初始化。


💧静态代码块执行:如果类中有静态代码块,那么在初始化阶段会执行这些静态代码块。


💧执行父类的初始化:如果该类有父类,并且父类还没有被初始化,那么会先初始化父类。


   初始化过程是按照严格的顺序进行的,保证了每个类的初始化操作是可控的。

🌊类加载

 类加载是Java代码运行过程的关键步骤之一。它负责将类的字节码加载到JVM中,并对其进行解析、验证和准备。类加载过程主要包括以下步骤:


💧加载:查找类的字节码,并将其加载到内存中。


💧连接:包括验证、准备和解析阶段。


💧初始化:执行类的初始化操作。


类加载过程由类加载器(ClassLoader)执行,Java中有三种类加载器:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。


启动类加载器:负责加载Java核心库,如rt.jar。它是Java虚拟机的一部分,由C++实现。


扩展类加载器:负责加载Java扩展库,如ext目录下的JAR文件。它是由Java编写的,是sun.misc.Launcher$ExtClassLoader类的实例。


应用程序类加载器:也称为系统类加载器,负责加载应用程序的类路径(Classpath)下的类。它是由Java编写的,是sun.misc.Launcher$AppClassLoader类的实例。


这三种类加载器按照父子关系形成了一种层次结构,即双亲委派模型。

🌊双亲委派机制

 双亲委派机制是Java类加载器的一种工作方式。当一个类加载器接收到加载类的请求时,它会先将这个请求委派给其父加载器进行处理。只有在父加载器无法找到所需类的情况下,子加载器才会尝试自己加载。


这种机制的好处在于可以保证类的加载是一种层次结构,避免了类的重复加载和冲突。它的工作流程如下:


💧当一个类加载器收到加载类的请求时,首先检查是否已经被加载过。如果已经加载过,直接返回对应的类。


💧如果尚未加载过,则将加载请求委派给父加载器。


💧父加载器接收到请求后,重复上述过程,直到到达启动类加载器。如果启动类加载器无法加载该类,将返回一个ClassNotFoundException异常。


💧如果父加载器成功加载了类,将返回对应的类。子加载器收到类后,也会返回给请求者。


通过双亲委派机制,可以确保类的加载是从上到下的层次结构,避免了类的重复加载和安全性问题。

🌊总结

  Java代码的运行过程包括链接、初始化、类加载和双亲委派机制。链接阶段将Java源代码转换为可执行代码,包括验证、准备和解析。初始化阶段完成静态变量赋值和静态代码块执行等操作。类加载过程由启动类加载器、扩展类加载器和应用程序类加载器完成,并遵循双亲委派机制,确保类的加载是一种层次结构。


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!

相关文章
|
16天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
65 2
|
2月前
|
存储 Java API
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
127 2
|
2月前
|
安全 Java API
Java 17新特性让你的代码起飞!
【10月更文挑战第4天】自Java 8发布以来,Java语言经历了多次重大更新,每一次都引入了令人兴奋的新特性,极大地提升了开发效率和代码质量。本文将带你从Java 8一路走到Java 17,探索那些能让你的代码起飞的关键特性。
83 1
|
1月前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
41 5
Java反射机制:解锁代码的无限可能
|
2天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
27天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
60 3
|
1月前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
92 10
|
28天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
26天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别