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

JVM---Java 类生命周期与类加载机制

Java 类生命周期与类加载机制

目录

  1. 类的生命周期
  2. 类加载器机制
  3. JVM类全生命周期流程图

类的生命周期

类的生命周期描述了一个类从加载、使用到卸载的完整过程(7个阶段

在这里插入图片描述

1. 加载阶段(Loading)

  1. 加载过程

    • 类加载器通过全限定名,从三种渠道获取字节码:
      • 本地文件系统
      • 网络资源
  • 动态生成(如动态代理)
  1. 内存分配

    内存区域存储内容作用特性
    方法区InstanceKlass 对象类元信息存储
    堆内存java.lang.Class 对象Java层类信息访问入口
  2. 开发工具

    # 使用HSDB查看内存对象
    java -cp sa-jdi.jar sun.jvm.hotspot.HSDB
    

2. 连接阶段(Linking)

① 验证(Verification)
  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证
② 准备(Preparation)
  • 为静态变量分配内存
  • 设置默认初始值(如 int->0, boolean->false)
③ 解析(Resolution)
  • 符号引用转直接引用
  • 分为静态解析与动态解析

3. 初始化阶段()

  • 执行类构造器代码(静态变量赋值、静态代码块)
  • 父类优先初始化原则
  • 线程安全保证(同步锁)

类加载器机制

类加载器架构

启动类加载器
C++
扩展类加载器
应用程序类加载器
自定义类加载器

类加载器类型

加载器类型加载路径实现语言
启动类加载器$JAVA_HOME/libC++
扩展类加载器$JAVA_HOME/lib/extJava
应用程序类加载器classpathJava
自定义类加载器自定义路径Java

双亲委派机制

应用类加载器 扩展类加载器 启动类加载器 1.委托查询 2.继续向上委派 3.未找到类 4.未找到类 5.自行查找加载 应用类加载器 扩展类加载器 启动类加载器
机制优点

✅ 避免核心类篡改
✅ 防止重复加载
✅ 实现资源隔离(如Tomcat容器)

打破双亲委派场景
  1. SPI机制(DriverManager)
  2. OSGi热部署
  3. 自定义类加载器重写loadClass

JVM类全生命周期流程图

类加载器 JVM GC 类加载阶段 1.Loading(获取二进制流) 2.Linking(验证→准备→解析) 3.Initialization(静态初始化) 类的使用阶段 4.实例化对象(new) 5.访问静态字段/方法 6.运行时方法调用 类卸载阶段 7.GC可达性分析 清理元空间 卸载类信息 保持加载状态 alt [不可达] [仍在使用] 类加载器 JVM GC

类卸载条件

  1. 堆中无该类的实例
  2. 对应的Class对象未被引用
  3. 类加载器实例已被回收
  4. 实战技巧

查看类加载路径

// 打印当前线程上下文类加载器路径
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL[] urls = ((URLClassLoader)loader).getURLs();
System.out.println(Arrays.toString(urls));

自定义类加载器模板

public class CustomClassLoader extends ClassLoader {
    @Override
    protected Class<?> findClass(String name) {
        byte[] data = loadClassData(name);
        return defineClass(name, data, 0, data.length);
    }
    
    private byte[] loadClassData(String className) {
        // 实现类文件加载逻辑
    }
}

相关文章:

  • 高版本node(17+)环境下VUE2项目启动报错
  • 失败的面试经历(ʘ̥∧ʘ̥)
  • 从过拟合到强化学习:机器学习核心知识全解析
  • 关于playwright的data-testid
  • 深入探索Android Bitmap:从原理到实战
  • 【人工智能基础2】人工神经网络、卷积神经网络基础、循环神经网络、长短时记忆网络
  • 【排序】快速排序
  • Python —— random.choice()的用法
  • 数学——A. K-divisible Sum + D. Exam in MAC
  • Unity屏幕适配——立项时设置
  • 案例驱动的 IT 团队管理:创新与突破之路:第一章 重构 IT 团队管理:从传统到创新-1.2.2 方法论提炼:可复用的管理模型
  • 【uni-app运行错误】SassError: expected selector @import “@/uni.scss“;
  • 用通义大模型写爬虫程序,汇总各科成绩
  • Datawhale coze-ai-assistant 笔记3
  • 初阶数据结构(C语言实现)——5.2 二叉树的顺序结构及堆的实现
  • promise和settimeout的区别,谈一谈eventloop
  • 六、实战开发 uni-app x 项目(仿京东)- 分类页
  • 【二分算法】-- 寻找旋转排序数组中的最小值
  • 2025 香港 Web3 嘉年华:全球 Web3 生态的年度盛会
  • 如何进行前端项目的自动化部署?请简述主要流程和常用工具。
  • 高温最强时段来了!北方局地高温有明显极端性
  • 人民日报评论员观察:稳就业,抓好存量、增量、质量
  • 首届中国人文学科年度发展大会启幕,共话AI时代人文使命
  • 国内规模最大女子赛艇官方赛事在沪启航,中外41支队伍逐浪
  • 上海博物馆展览进校园,“小先生”传递文物知识
  • 现场丨在胡适施蛰存等手札与文献间,再读百年光华