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

embedded/2025/3/18 9:18:31/

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. 实战技巧

查看类加载路径

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

自定义类加载器模板

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

http://www.ppmy.cn/embedded/173550.html

相关文章

2025年03月11日Github流行趋势

项目名称&#xff1a;pydoll 项目地址url&#xff1a;https://github.com/thalissonvs/pydoll项目语言&#xff1a;Python历史star数&#xff1a;1372今日star数&#xff1a;148项目维护者&#xff1a;thalissonvs, apps/github-actions, LucasAlvws, CaioWzy, Patolox项目简介…

在图像/视频中裁剪出人脸区域

1. 在图像中裁剪人脸区域 import face_alignment import skimage.io import numpy from argparse import ArgumentParser from skimage import img_as_ubyte from skimage.transform import resize from tqdm import tqdm import os import numpy as np import warnings warni…

用UML搞懂ASPICE(6)过程能力确定的能力维度

继续用UML搞懂ASPICE v4.0。下面是“3.过程能力确定”中的“3.2.度量框架”。 3.2.度量框架/ Measurement framework 评估师对给定过程的最终能力等级的导出规则是由过程能力等级模型来表示。 3.2.1.过程能力等级和过程属性/ Process capability levels and process attribu…

通过AI自动生成springboot的CRUD以及单元测试与压力测试源码(二)

本篇文章分为三个部分&#xff0c;即&#xff1a; 通过AI自动生成springboot的CRUD以及单元测试与压力测试源码&#xff08;一&#xff09; 通过AI自动生成springboot的CRUD以及单元测试与压力测试源码&#xff08;二&#xff09; 通过AI自动生成springboot的CRUD以及单元测试与…

就像BGP中的AS_PATH一样,无论路途多远,我愿意陪你一起走——基于华为ENSP的BGP的Community[社团属性]深入浅出

本篇技术博文摘要 &#x1f31f; 1. BGP的社团属性&#xff08;Community&#xff09; 定义&#xff1a;BGP中的Community属性用于对路由进行标记和分类&#xff0c;帮助控制路由的传播和策略实施。功能&#xff1a;通过不同的Community标签&#xff0c;可以实现流量的抓取、路…

事件系统简介+Button组件+Toggle简介

UI的事件交互 Canvas添加 Ignore Reversed Graphics:是否忽略Canvas反向的事件操作 Blocking Objects&#xff1a;遮挡事件的物体&#xff08;2D物体【精灵片】&#xff0c;3D物体&#xff09; Blocking Mask:遮挡事件的物体所在的渲染层 交互元素 Raycast Target:是否接收Canv…

HTTP+DNS综合实验

一、实验拓扑 二、实验要求 1、学校内部的HTTP客户端可以正常通过域名www.baidu.com访问到百度网络中的HTTP服务器。 2、学校内部网络基于192.168.1.0/24划分&#xff0c;PC1可以正常访问3.3.3.0/24网段&#xff0c;但是PC2不允许。 3、学校内部网络使用静态路由&#xff0c…

Redis系列:深入理解缓存穿透、缓存击穿、缓存雪崩及其解决方案

在使用Redis作为缓存系统时&#xff0c;我们经常会遇到“缓存穿透”、“缓存击穿”和“缓存雪崩”等问题&#xff0c;这些问题一旦出现&#xff0c;会严重影响应用性能甚至造成服务不可用。因此&#xff0c;理解这些问题的产生原因和解决方案非常重要。 本文将全面讲解缓存穿透…