类加载过程?类隔离了解过吗?


类加载过程详解

类加载是 JVM 将类的字节码从磁盘、网络或其他来源加载到内存,并转换为 Class 对象的过程,主要分为以下 五个阶段


1. 加载(Loading)
  • 任务:查找类的二进制字节流(如 .class 文件、JAR 包、动态代理生成等),并将其转换为方法区的运行时数据结构。
  • 触发条件
    • 首次创建类实例(new)。
    • 访问类的静态字段或方法。
    • 反射调用(如 Class.forName())。
  • 类加载器
    • 引导类加载器(Bootstrap ClassLoader):加载 JRE/lib 核心库(如 rt.jar)。
    • 扩展类加载器(Extension ClassLoader):加载 JRE/lib/ext 扩展库。
    • 应用类加载器(Application ClassLoader):加载用户类路径(-classpath)的类。
    • 自定义类加载器:用户继承 ClassLoader 实现,用于特定场景(如热部署、模块化)。

2. 验证(Verification)

确保字节码符合 JVM 规范,防止恶意代码攻击,具体检查:

  • 文件格式验证:魔数、版本号等是否符合规范。
  • 元数据验证:类是否有父类、是否实现接口等语义检查。
  • 字节码验证:控制流是否合法(如跳转指令不越界)。
  • 符号引用验证:引用的类、方法、字段是否存在(发生在解析阶段)。

3. 准备(Preparation)
  • 任务:为 静态变量 分配内存并设置初始值(零值)。
    • 示例:static int value = 123; 在此阶段 value 被赋值为 0,而非 123
  • 特殊处理:若字段为 final 常量(static final),直接赋真实值(如 static final int value = 123;)。

4. 解析(Resolution)

将常量池中的 符号引用 转换为 直接引用

  • 符号引用:以文本形式描述引用的目标(如 java/lang/Object)。
  • 直接引用:指向目标在内存中的指针、偏移量或句柄。
  • 解析类型:类/接口、字段、方法、方法类型等。

5. 初始化(Initialization)
  • 任务:执行类构造器 <clinit>() 方法,合并所有静态代码块和静态变量赋值操作。
  • 触发条件:类被首次主动使用时(如 new、访问静态字段)。
  • 线程安全:JVM 保证 <clinit>() 方法在多线程下被正确加锁同步。

类隔离的实现与原理

类隔离的核心是通过 不同的类加载器 加载同名类,使 JVM 将其视为不同的类,从而避免冲突。以下是常见实现方式:


1. 类加载器的命名空间
  • 规则:每个类由其加载器和全限定名(如 com.example.MyClass)共同唯一标识。
  • 示例
    ClassLoader loader1 = new MyClassLoader();
    ClassLoader loader2 = new MyClassLoader();
    Class<?> class1 = loader1.loadClass("com.example.MyClass");
    Class<?> class2 = loader2.loadClass("com.example.MyClass");
    // class1 != class2,即使字节码相同
    
2. 双亲委派模型的打破

默认类加载器遵循 双亲委派模型(优先由父加载器加载),但在隔离场景下需打破该模型:

  • 自定义类加载器:重写 loadClass() 方法,直接加载特定路径的类,不委托父加载器。
  • 应用场景
    • Tomcat WebApp 隔离:每个 Web 应用使用独立的 WebappClassLoader,加载 /WEB-INF/classes/WEB-INF/lib 下的类。
    • OSGi 模块化:每个 Bundle 有自己的类加载器,实现动态模块化。
3. 模块化系统(Java 9+)

通过 JPMS(Java Platform Module System) 实现更细粒度的类隔离:

  • 模块描述符(module-info.java):定义模块的导出包和依赖关系。
  • 类可见性控制:未导出的包对其他模块不可见,彻底隔离实现细节。

类隔离的实际应用

场景实现方式优势
多版本库共存不同类加载器加载不同版本的 JAR(如 Log4j 1.x 和 2.x)。避免版本冲突
微服务热部署每个服务使用独立类加载器,重启服务时替换类加载器实现无停机更新。提升系统可用性
插件化架构插件作为独立模块,由专属类加载器加载,主程序通过接口交互。动态扩展功能

🐶

  • 类加载过程:加载 → 验证 → 准备 → 解析 → 初始化,确保类合法且可用。
  • 类隔离机制:通过类加载器命名空间和打破双亲委派,实现多版本共存、模块化等需求。
  • 应用价值:解决依赖冲突、支持热部署、构建灵活架构,是现代 Java 应用的核心技术之一。

在这里插入图片描述

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

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

相关文章

使用msmtp和mutt在CentOS上发送指定目录下的所有文件作为邮件附件

1.安装 msmtp&#xff1a; 如果尚未安装&#xff0c;请先通过以下命令安装msmtp。 sudo yum install msmtp 2.配置 msmtp 使用新浪邮箱&#xff1a; 创建或编辑配置文件~/.msmtprc&#xff0c;输入以下内容&#xff08;记得替换授权码&#xff09;。 defaults tls on tls_st…

Vue+Elementui首页看板

源码 <template><!-- 查询条件--><div class="optimize-norm" v-loading="selectDataLoading"><el-form :model="queryParams" ref="queryRef" style="padding-bottom:8px" :inline="true"…

汇编学习之《指针寄存器大小端学习》

什么是指针寄存器&#xff1f; 操作栈的寄存器 栈&#xff1a; 保存函数里面传递的参数&#xff0c;局部变量等。 EBP&#xff1a; 指向栈底的指针 ESP&#xff1a; 指向栈顶的指针。 计算入栈地址变化规则 通过OllDbg查看 有可能点击安装的时候栈区域第一次查看会没有显…

Oracle数据库数据编程SQL<3.7 PL/SQL 触发器(Trigger)>

触发器是Oracle数据库中的一种特殊存储过程&#xff0c;它会在特定数据库事件发生时自动执行。触发器通常用于实现复杂的业务规则、数据验证、审计跟踪等功能。 目录 一、触发器基本概念 1. 触发器特点 2. 触发器组成要素 二、触发器类型 1. DML触发器 2. DDL触发器 3.…

2025年渗透测试面试题总结-某 携程旅游-基础安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 携程旅游-基础安全工程师 反序列化原理 核心原理 扩展分析 SQL注入本质 核心原理 扩展分析 SQL注…

CSS 边框(Border)样式详解

CSS 边框&#xff08;Border&#xff09;样式详解 CSS 提供了多种边框样式&#xff0c;使我们能够控制元素的外观。本文将详细介绍 CSS 边框的各种属性及应用示例。 1. 基本边框属性 CSS 主要使用 border 相关属性定义边框&#xff0c;基本语法如下&#xff1a; border: [边…

SpringCould微服务架构之Docker(6)

容器的基本命令&#xff1a; 1. docker exec &#xff1a;进入容器执行命令 2. docker logs: -f 持续查看容器的运行日志 3. docker ps&#xff1a;查看所有运行的容器和状态 案例&#xff1a;创建运行一个容Nginx容器 docker run--name myNginx -p 80:80 -d nginx 命…

unity3d端监听 uri scheme

一、消息监听 1.创建一个脚本命名为 “URISchemeListener” &#xff0c;用于接收URI消息&#xff08;代码如下&#xff09;。 using System; using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.UI;public class URISchemeListener : MonoBehavio…

网络信息安全应急演练方案

信息安全应急演练方案 总则 &#xff08;一&#xff09;编制目的 旨在建立并完善应对病毒入侵、Webshell 攻击以及未授权访问等信息安全突发事件的应急机制&#xff0c;提升组织对这类事件的快速响应、协同处理和恢复能力&#xff0c;最大程度降低事件对业务运营、数据安全和…

电商场景下高稳定性数据接口的选型与实践

在电商系统开发中&#xff0c;API接口需要应对高并发请求、动态数据更新和复杂业务场景。我将重点解析电商场景对数据接口的特殊需求及选型方案。 一、电商API必备的四大核心能力 千万级商品数据实时同步 支持SKU基础信息/价格/库存多维度更新每日增量数据抓取与历史版本对比…

Android R adb remount 调用流程

目的&#xff1a;调查adb remount 与adb shell进去后执行remount的差异 调试方法&#xff1a;添加log编译adbd,替换system\apex\com.android.adbd\bin\adbd 一、调查adb remount实现 关键代码&#xff1a;system\core\adb\daemon\services.cpp unique_fd daemon_service_to…

多模态大语言模型arxiv论文略读(二)

Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representation Space ➡️ 论文标题&#xff1a;Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representat…

【运维】负载均衡

老规矩&#xff0c;先占坑&#xff0c;后续更新。 开头先理解一下所谓的“均衡”&#xff0c;不能狭义地理解为分配给所有实际服务器一样多的工作量&#xff0c;因为多台服务器的承载能力各不相同&#xff0c;这可能体现在硬件配置、网络带宽的差异&#xff0c;也可能因为某台…

大型语言模型Claude的“思维模式”最近被公开解剖

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Ubuntu环境安装

1. 安装gcc、g和make sudo apt update sudo apt install build-essential 2. 安装cmake ubuntu安装cmake的三种方法&#xff08;超方便&#xff01;&#xff09;-CSDN博客 3. 安装ssh sudo apt-get install libssl-dev

【力扣hot100题】(028)删除链表的倒数第N个节点

链表题还是太简单了。 怕越界所以先定义了一个头结点的头结点&#xff0c;然后定义快慢指针&#xff0c;快指针先走n步&#xff0c;随后一起走&#xff0c;直到快指针走到头&#xff0c;删除慢指针后一个节点即可。 /*** Definition for singly-linked list.* struct ListNod…

C/C++回调函数实现与std::function和std::bind介绍

1 概述 回调函数是一种编程模式&#xff0c;指的是将一个函数作为参数传递给另一个函数&#xff0c;并在某个特定事件发生时或满足某些条件时由该函数调用。这种机制允许你定义在特定事件发生时应执行的代码&#xff0c;从而实现更灵活和模块化的程序设计。 2 传统C/C回调实现…

【蓝桥杯】单片机设计与开发,速成备赛

一、LED模块开看&#xff0c;到大模板 二、刷第零讲题目&#xff08;直接复制模板&#xff09; 三、空降芯片模板直接调用部分&#xff08;听完再敲代码&#xff09; 四、第十三讲开刷省赛题&#xff08;开始自己背敲模板&#xff09; 五、考前串讲刷一遍 b连接&#xff1…

Java 基础-28- 多态 — 多态下的类型转换问题

在 Java 中&#xff0c;多态&#xff08;Polymorphism&#xff09;是面向对象编程的核心概念之一。多态允许不同类型的对象通过相同的方法接口进行操作&#xff0c;而实际调用的行为取决于对象的实际类型。虽然多态提供了极大的灵活性&#xff0c;但在多态的使用过程中&#xf…

Epub转PDF软件Calibre电子书管理软件

Epub转PDF软件&#xff1a;Calibre电子书管理软件 https://download.csdn.net/download/hu5566798/90549599 一款好用的电子书管理软件&#xff0c;可快速导入电脑里的电子书并进行管理&#xff0c;支持多种格式&#xff0c;阅读起来非常方便。同时也有电子书格式转换功能。 …