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

类的生命周期

一个类完整的生命周期,会经历五个阶段,分别为:加载、连接、初始化使用、和卸载。其中的连接又分为验证、准备和解析。
在这里插入图片描述

1.加载

类的加载阶段就是:找到需要加载的类并把类的信息加载到jvm的方法区中,然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的入口。

类加载其实包括加载、连接、初始化三个阶段。类加载强调一个jvm能够直接使用所需的类,所以类必须完成初始化。

1.类的理论加载方式:

  • 据类的全路径名找到相应的class文件,然后从class文件中读取文件内容;(常用)
  • 从jar文件中读取。另外,还有下面几种方式也比较常用:(常用)
  • 从网络中获取:比如10年前十分流行的Applet。
  • 根据一定的规则实时生成,比如设计模式中的动态代理模式,就是根据相应的类自动生成它的代理类。
  • 从非class文件中获取,其实这与直接从class文件中获取的方式本质

2.类的实现加载方式:

  • Class.forName():
    适合需要执行类的静态初始化的情况,常用于 JDBC 驱动加载
  • ClassLoader.loadClass()
    仅加载类,不触发静态初始化,提供更灵活的类加载控制。
  • Class.newInstance() 和 Constructor.newInstance():
    用于创建类的实例,后者更灵活,可调用指定构造函数
  • 自定义类加载器
    从自定义位置加载类,实现特殊的类加载逻辑,如文件系统或网络加载。
  • ServiceLoader
    用于加载服务提供者,遵循 SPI 机制,实现服务发现和加载。

2.连接

2.1 验证

进行类的合法性校验

会对比如字节码格式、变量与方法的合法性、数据类型的有效性、继承与实现的规范性等等进行检查,确保被加载的类能够正常被jvm运行。

2.2 准备

简单说就是分内存、赋初值。

为类的静态变量分配内存,并设为jvm默认的初值;对于非静态的变量,则不会为它们分配内存。

注意:设置初始值为jvm默认初值,而不是程序设定。
规则如下:

  • 基本类型(int、long、short、char、byte、boolean、float、double)的默认值为0
  • 引用类型的默认值为null
  • 常量的默认值为我们程序中设定的值,比如我们在程序中定义final static int a = 100,则准备阶段中a的初值就是100。

2.3 解析

这一阶段的任务就是把常量池中的符号引用转换为直接引用

3.初始化

类初始化阶段是类加载过程的最后一步。而也是到了该阶段,才真正开始执行类中定义的java程序代码(字节码),之前的动作都由虚拟机主导。

类的初始化时机:只有当类被直接引用的时候,才会触发类的初始化。

3.1 类被直接引用的情况:

  • 通过以下几种方式:
    1.new关键字创建对象
    2.读取或设置类的静态变量
    3.调用类的静态方法
  • 通过反射方式执行1里面的三种方式;
  • 初始化子类的时候,会触发父类的初始化;
  • 作为程序入口直接运行时(调用main方法);
  • 接口实现类初始化的时候,会触发直接或间接实现的所有接口的初始化。

3.2 类的初始化注意点

1、类的初始化,会自上而下运行静态代码块或静态赋值语句,非静态与非赋值的静态语句均不执行。
2、如果存在父类,则父类先进行初始化,是一个典型的递归模型。

区别于对象的初始化,类的初始化所做的一起都是基于类变量或类语句的,也就是说执行的都是共性的抽象信息。而我们知道,类就是对象实例的抽象。

4.使用

类的使用分为直接引用和间接引用。
直接引用与间接引用等判别条件: 看对该类的引用是否会引起类的初始化

类的间接引用,主要有下面几种情况

  • 当引用了一个类的静态变量,而该静态变量继承自父类的话,不引起初始化
  • 定义一个类的数组,不会引起该类的初始化;
  • 当引用一个类的的常量时,不会引起该类的初始化

5.卸载

  • 1.该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
  • 2.加载该类的ClassLoader已经被回收。
  • 3.该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
    如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。
http://www.xdnf.cn/news/4967.html

相关文章:

  • FAISS 与机器学习、NLP 的关系
  • 【相机标定】OpenCV 相机标定中的重投影误差与角点三维坐标计算详解
  • 【教学类-34-12】20250509(通义万相)4*3蝴蝶拼图(圆形、三角、正方、半圆的凹凸小块+数字提示+参考图灰色)
  • 什么是AIOps
  • python小区物业管理系统-小区物业报修系统
  • 操作系统的初步了解
  • 重构 cluster-db 选择器,新增限制字段 showDb 不影响原功能前提实现查询功能增量拓展
  • ABP vNext + EF Core 实战性能调优指南
  • 捌拾叁- 量子傅里叶变换
  • 【25软考网工】第六章 网络安全(1)网络安全基础
  • Rust 中的 `String`、`str` 和 `str`:深入解析与使用指南
  • Java大师成长计划之第16天:高级并发工具类
  • 自动驾驶的“眼睛”:用Python构建智能障碍物检测系统
  • U9C对接飞书审批流完整过程
  • 【Pandas】pandas DataFrame clip
  • js原型污染 + xss劫持base -- no-code b01lersctf 2025
  • PostgreSQL 18 Beta 1发布,有哪些功能亮点?
  • P2572 [SCOI2010] 序列操作 Solution
  • Shell 脚本编程详细指南:第五章 - 函数与参数传递
  • ROS1 和 ROS2 在同一个系统中使用
  • 分布式ID设计 数据库主键自增
  • 第423题-有效的括号序列
  • 大模型——Trae IDE 指南:轻松配置自定义 AI 规则 (Trae Rules)
  • 阅文集团C++面试题及参考答案
  • 服务器配置错误导致SSL/TLS出现安全漏洞,如何进行排查?
  • 汽车制造行业的数字化转型
  • 华为云Flexus+DeepSeek征文|从开通到应用:华为云DeepSeek-V3/R1商用服务深度体验
  • 【软件设计师:存储】16.计算机存储系统
  • gitlab相关面试题及答案
  • 深入了解 Stable Diffusion:AI 图像生成的奥秘