浅谈双亲委派机制

简介: 经典八股文之双亲委派模型

Java相关文章


Java类加载机制

  1. 类加载机制
  1. 加载、验证、准备、解析、初始化
  1. 加载
  1. 指将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
  1. 验证
  1. 确保被夹在类的正确性,文件格式验证、元数据验证、字节码验证、符号音乐验证
  1. 准备
  1. 为类的静态变量分配内存并赋默认值
  2. 只对static修饰的静态变量进行内存分配、福默认值
  3. 对final的静态字面值常量直接赋初值
  4. 内存分配的对象。Java 中的变量有类变量类成员变量两种类型,类变量指的是被static修饰的变量,而其他所有类型的变量都属于类成员变量。在准备阶段,JVM只会为类变量分配内存,而不会为类成员变量分配内存。类成员变量的内存分配需要等到初始化阶段才开始。
  5. 初始化的类型。在准备阶段,JVM 会为类变量分配内存,并为其初始化。但是这里的初始化指的是为变量赋予 Java 语言中该数据类型的零值,而不是用户代码里初始化的值。
  1. 解析
  1. 解析阶段JVM 针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符 7 类引用进行解析。这个阶段的主要任务是将其在常量池中的符号引用替换成直接其在内存中的直接引用
  1. 初始化
  1. 初始化是为类的静态变量赋予正确的初始值,准备阶段初始化阶段看似有点矛盾,其实是不矛盾的。
  2. 如果类中有语句:private static int a = 10,它的执行过程是这样的,首先字节码文件被加载到内存后,先进行链接的验证这一步骤,验证通过后准备阶段,给a分配内存,因为变量a是static的。


双亲委派模型

  1. Java的类加载器
  1. 启动类加载器
  2. 扩展类加载器
  3. 应用类加载器
  1. 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式


为什么要引入双亲委派机制

  1. 防止出现多分相同的字节码,类加载器和类确定唯一性
  2. 使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系,从而使得基础类得到统一
  3. 避免了多份同样字节码的加载
  4. 保证核心api不会被篡改



为什么打破双亲委派机制

  1. 以Tomcat为例,一个Tomcat可以运行多个web服务,为了保证各个服务的同名类的加载安全,Tomcat给每个 Web 应用创建一个类加载器实例(WebAppClassLoader),该加载器重写了loadClass方法,优先加载当前应用目录下的类,如果当前找不到了,才一层一层往上找,实现web隔离

  1. 如何自定义类加载器
  1. 继承ClassLoader类重写findClass方法
相关文章
在Colab上测试Mamba
我们在前面的文章介绍了研究人员推出了一种挑战Transformer的新架构Mamba
556 2
|
算法 C语言
使用指针来优化C语言程序性能
在C语言中,指针是一种强大且重要的概念。合理地使用指针可以提高程序的性能,减少内存的开销,并使代码更加简洁和易于维护。本文将介绍一些使用指针来优化C语言程序性能的技术。
481 0
|
9月前
|
人工智能 监控 安全
从 DeepSeek 敏感信息泄露谈可观测系统的数据安全预防
探讨了 SLS 中增强数据安全的几种方式:权限精细化管控有效减少了潜在安全风险;接入层脱敏技术阻止敏感数据落库,提升了隐私保护;StoreView 字段集控制通过限制查询数据范围,降低数据泄露损害。智能监控系统提供实时监测,快速识别并阻断异常拖库行为,为企业提供了迅速响应和抵御威胁的能力。
|
人工智能 前端开发 JavaScript
前端大模型入门(二):掌握langchain的核心Runnable接口
Langchain.js 是 Langchain 框架的 JavaScript 版本,专为前端和后端 JavaScript 环境设计。最新 v0.3 版本引入了强大的 Runnable 接口,支持灵活的执行方式和异步操作,方便与不同模型和逻辑集成。本文将详细介绍 Runnable 接口,并通过实现自定义 Runnable 来帮助前端人员快速上手。
598 1
|
Kubernetes 测试技术 数据安全/隐私保护
如何使用Vcluster实现Kubernetes中的多租户
如何使用Vcluster实现Kubernetes中的多租户
545 0
|
存储 JSON Kubernetes
在K8S中,服务是如何发布的?
在K8S中,服务是如何发布的?
|
测试技术 C#
.NET单元测试使用Bogus或AutoFixture按需填充的几种方式和最佳实践
【7月更文挑战第13天】AutoFixture 和 Bogus 都是流行的 C#库,用于在单元测试中按需填充测试数据。以下是它们的几种使用方式和最佳实践:一、AutoFixture:1.直接定制 2.使用匿名函数 3.实现ICustomization接口 4.使用Build方法。 二、最佳实践Bogus:1.安装2.使用。
249 2
|
Java 网络安全 网络架构
【Java】已解决java.net.ConnectException异常
【Java】已解决java.net.ConnectException异常
3520 0
|
存储 缓存 算法
【项目设计】高并发内存池—tcmalloc核心框架学习(二)
【项目设计】高并发内存池—tcmalloc核心框架学习
546 1
|
编解码 JavaScript
解释基本的3D理论
本文介绍了所有基本理论,这些理论在开始使用 3D 时很有用。
450 0
解释基本的3D理论