深入JVM类加载器(1)

简介: 深入JVM类加载器

01、类加载器原理

02、类加载器树状结构、双亲委托(代理)机制

03、自定义类加载器(文件、网络、加密)

04、线程上下文类加载器

05、服务器类加载原理


1、类加载器的作用

将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。

屏幕快照 2022-05-10 上午11.41.58.png


类缓存

标准的Java SE类加载器可以按要求查找类,但一旦某个类加载到类加载器中,它将维持加载(缓存)一段时间,不过JVM垃圾收集器可以回收这些Class对象。


2、类加载器的层次结构(树状结构)


引导类加载器(bootstarap class loader)(C)

- 它用来加载java的核心库(JAVA_HOME/jre/lib/rt.jar或sun.boot.class.path路径下的内容),是用原生代码来实现的,并不继承自java.lang.ClassLoader。

- 加载扩展类和应用程序类加载器,并指定他们的父类加载器。


扩展类加载器(extensions class loader)(java)

- 用来加载java的扩展库(JAVA_HOME/jre/ext/*.jar,或java.ext.dirs路径下的内容)。Java虚拟机的实现会提供一个扩展库目录,该类加载器在此目录里面查找并加载java类。

- 由sun.misc.Launcher$ExtClassLoader实现


应用程序类加载器(application class loader)(java)

- 它根据java应用的类路径(classpath ,java.class.path路径类)

- 一般来说java应用的类都是由它来完成加载的

- 由sun.misc.Launcher$AppClassLoader实现


自定义类加载器(java写的)

- 开发人员可以通过继承java.lang.ClassLoader类的方法实现自己的类加载器,以满足一些特殊的需求


屏幕快照 2022-05-10 上午11.42.17.png


Java.class.ClassLoader类介绍

作用:

-Java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成期对应的字节代码,然后从这些字节代码中定义一个java类,既java.lang.Class类的一个实例。

-除此之外,ClassLoader还负责加载java应用的所需资源,如图像文件和配置文件等。


相关方法

- getparent() 返回该类加载器的父类加载器

- loadClass(String name) 加载名称为name的类,返回结果是java.lang.Class类的实例

- findClass(String name)查找名称为name的类,返回结果是java.lang.Class类的实例

- findLoadedClass(String name) 查找名称为name的已经被加载过的类,返回结果是java.lang.Class类的实例

- defineClass(String name,byte[] b,int off,int len)把字节数组b中的内容转换成java类,返回的结果是java.lang.Class类的实例,这个方法被声明final的。

- resolveClass(Class

package com.lyy.test;
public class Demo2 {
    public static void main(String[] args) {
        System.out.println(ClassLoader.getSystemClassLoader());
        System.out.println(ClassLoader.getSystemClassLoader().getParent());
        System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent()); //JAVA_HOME/jre/lib/rt.jar
        System.out.println(System.getProperty("java.class.path"));
        System.out.println("=====================================");
        String a = "gaogao";
        System.out.println(a.getClass().getClassLoader());
        System.out.println(a);
    }
}

类加载器的代理模式

 代理模式

— 交给其他加载器来加载指定的类

 双亲委托机制

— 就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,一次追溯,知道最高的爷爷辈的,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

— 双亲委托机制是为了保证java核心库的类型安全。

这种机制就保证不会出现用户自己能定义java.lang.Object类的情况。

类加载器除了用户加载类,也是安全的最基本的屏障。

 双亲委托机制是代理模式的一种

— 并不是所有的类加载器都采用双亲委托机制。

— Tomcat服务器类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器,这与一般类加载器的顺序是相反的。


屏幕快照 2022-05-10 上午11.43.01.png


自定义类加载器

自定义类加载器的流程

— 首先检查请求的类型是否已经被这个类加载器装载到命名空间中了,

如果已经装载,直接返回;

— 委派类加载请求给父类加载器能够完成,则返回父类加载器加载的Class实例;

— 调用本类加载器的findClass(…)方法,视图获取对应的字节码,如果获取到,则调用defineClass(…)导入类型到方法区;如果获取不到对应的字节码或者其他原因失败,返回异常loadClass(…)loadClass(…)转抛异常,终止加载过程。

— 注意:被两个类加载器加载的同一个类,JVM不认为是相同的类


package com.lyy.temp;
public class HelloWrold {
public static void main(String[] args) {
    System.out.println("aaa");
}
}
package com.lyy.test;
/**
 * 测试自定义类加载器(FileSystemClassLoader)
 * @author 01
 *
 */
public class Demo3 {
    public static void main(String[] args) throws ClassNotFoundException {
        FileSystemClassLoader load = new FileSystemClassLoader("E:/VIP");
        FileSystemClassLoader load2 = new FileSystemClassLoader("E:/VIP");
        Class<?> c = load.loadClass("com.lyy.temp.HelloWrold");
        Class<?> c2 = load.loadClass("com.lyy.temp.HelloWrold");
        Class<?> c3 = load2.loadClass("com.lyy.temp.HelloWrold");
        Class<?> c4 = load2.loadClass("java.lang.String");
        Class<?> c5 = load2.loadClass("com.lyy.test.Demo1");
        System.out.println(c.hashCode());
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());//同一个类,被不同的加载器加载,JVM认为也是不相同的类
        System.out.println(c4.hashCode());
        System.out.println(c3.getClassLoader());//自定义的类加载器
        System.out.println(c4.getClassLoader());//引导类加载器
        System.out.println(c5.getClassLoader());//系统默认的类加载器
    }
}
目录
相关文章
|
4月前
|
安全 前端开发 Java
【JVM的秘密揭秘】深入理解类加载器与双亲委派机制的奥秘!
【8月更文挑战第25天】在Java技术栈中,深入理解JVM类加载机制及其双亲委派模型是至关重要的。JVM类加载器作为运行时系统的关键组件,负责将字节码文件加载至内存并转换为可执行的数据结构。其采用层级结构,包括引导、扩展、应用及用户自定义类加载器,通过双亲委派机制协同工作,确保Java核心库的安全性与稳定性。本文通过解析类加载器的分类、双亲委派机制原理及示例代码,帮助读者全面掌握这一核心概念,为开发更安全高效的Java应用程序奠定基础。
98 0
|
3月前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
106 35
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
|
2月前
|
缓存 前端开发 Java
JVM知识体系学习二:ClassLoader 类加载器、类加载器层次、类过载过程之双亲委派机制、类加载范围、自定义类加载器、编译器、懒加载模式、打破双亲委派机制
这篇文章详细介绍了JVM中ClassLoader的工作原理,包括类加载器的层次结构、双亲委派机制、类加载过程、自定义类加载器的实现,以及如何打破双亲委派机制来实现热部署等功能。
68 3
|
3月前
|
Arthas Java 测试技术
JVM —— 类加载器的分类,双亲委派机制
类加载器的分类,双亲委派机制:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器;JDK8及之前的版本,JDK9之后的版本;什么是双亲委派模型,双亲委派模型的作用,如何打破双亲委派机制
JVM —— 类加载器的分类,双亲委派机制
|
2月前
|
前端开发 Java 应用服务中间件
JVM进阶调优系列(1)类加载器原理一文讲透
本文详细介绍了JVM类加载机制。首先解释了类加载器的概念及其工作原理,接着阐述了四种类型的类加载器:启动类加载器、扩展类加载器、应用类加载器及用户自定义类加载器。文中重点讲解了双亲委派机制,包括其优点和缺点,并探讨了打破这一机制的方法。最后,通过Tomcat的实际应用示例,展示了如何通过自定义类加载器打破双亲委派机制,实现应用间的隔离。
|
7月前
|
前端开发 安全 Java
深入浅出JVM(八)之类加载器
深入浅出JVM(八)之类加载器
|
4月前
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
69 0
|
4月前
|
开发者 C# Windows
WPF布局大揭秘:掌握布局技巧,轻松创建响应式用户界面,让你的应用程序更上一层楼!
【8月更文挑战第31天】在现代软件开发中,响应式用户界面至关重要。WPF(Windows Presentation Foundation)作为.NET框架的一部分,提供了丰富的布局控件和机制,便于创建可自动调整的UI。本文介绍WPF布局的基础概念与实现方法,包括`StackPanel`、`DockPanel`、`Grid`等控件的使用,并通过示例代码展示如何构建响应式布局。了解这些技巧有助于开发者优化用户体验,适应不同设备和屏幕尺寸。
126 0
|
4月前
|
安全 前端开发 Java
【JVM 探秘】ClassLoader 类加载器:揭秘 Java 类加载机制背后的秘密武器!
【8月更文挑战第25天】本文全面介绍了Java虚拟机(JVM)中的类加载器,它是JVM的核心组件之一,负责将Java类加载到运行环境中。文章首先概述了类加载器的基本工作原理及其遵循的双亲委派模型,确保了核心类库的安全与稳定。接着详细阐述了启动、扩展和应用三种主要类加载器的层次结构。并通过一个自定义类加载器的例子展示了如何从特定目录加载类。此外,还介绍了类加载器的完整生命周期,包括加载、链接和初始化三个阶段。最后强调了类加载器在版本隔离、安全性和灵活性方面的重要作用。深入理解类加载器对于掌握JVM内部机制至关重要。
179 0
|
5月前
|
存储 前端开发 Java
(二)JVM成神路之剖析Java类加载子系统、双亲委派机制及线程上下文类加载器
上篇《初识Java虚拟机》文章中曾提及到:我们所编写的Java代码经过编译之后,会生成对应的class字节码文件,而在程序启动时会通过类加载子系统将这些字节码文件先装载进内存,然后再交由执行引擎执行。本文中则会对Java虚拟机的类加载机制以及执行引擎进行全面分析。
103 0