JVM系列(二):JVM中类加载器相关知识笔记

简介: JVM虚拟机运行的文件是class文件,它是由我们的Java程序编译后产生的文件。类的加载:JVM虚拟机将指定的class文件读取到内存里,并解释运行该class文件里的Java程序的过程。类的卸载:将某个class文件的运行时数据从JVM虚拟机中移除的过程。

image_af85485e.png

今天继续给大家分享JVM相关的知识,欢迎互相沟通交流!

1、什么是类的加载和类的卸载

JVM虚拟机运行的文件是class文件,它是由我们的Java程序编译后产生的文件。

类的加载:JVM虚拟机将指定的class文件读取到内存里,并解释运行该class文件里的Java程序的过程。

类的卸载:将某个class文件的运行时数据从JVM虚拟机中移除的过程。

2、什么是class文件

class文件是一组以8个字节为基本单位的二进制流,

各个数据项目严格按照顺序紧凑地排序在文件之中,

中间没有添加任何分隔符,如果当数据项需要占用8个以上字节位的时候,按照高位在前的方式分割成若干个8个字节存储

数码:class文件的解释运行时数据本质是C++对象,也叫做kclass对象,这些运行时数据在JDK7之前放在永久代(PermGen),JDK8之后放在元空间(Metaspace)。

3、class类的生命周期

加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)

image_fdaca810.png

4、类加载器的作用

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。

5、类加载器的种类

image_f006bd70.png

5.1、Bootstrap ClassLoader (启动类加载器)

启动类加载器负责加载$JAVA\_HOME中jre/lib/rt.jar里面所有的class,由c++实现,不是classLoader子类

image_6dbbbe07.png

5.2、ExtensionClassLoader(扩展类加载器)

扩展类加载器由sun.misc.Launcher $ExtClassLoader实现,负责加载JRE的扩展目录,lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。由Java语言实现,父类加载器为null。

5.3、App ClassLoader(应用类加载器)

由sun.misc.Launcher $App-ClassLoader实现负,记载classpath中指定的jar包以及目录中class, 程序员一般会直接使用这个类加载器,如果程序员没有定义自己的类加载器,就作为应用程序的默认加载器。

5.4、User ClassLoader(自定义类加载器)

大家开发的时候其实绝大多数都是使用应用类加载器,针对一些应用类加载器不能满足的情况下,可以考虑使用自定义类加载器,来满足实际开发的业务要求。

自定义类加载器场景:

Tomcat:每个WebApp有自己的ClassLoader,加载每个WebApp的ClassPath路径上的类,一旦遇到Tomcat自带的Jar包就委托给CommonClassLoader进行加载。

一些核心机密类库,可以会把字节码加密,这样加载类的时候就必须对字节码进行解密,可以通过findClass读取URL中的字节码,然后加密,最后把字节数组交给defineClass()加载。

5.5、示例

public static void main(String[] args) {
    Test test=new Test();
    System.out.println(test.getClass().getClassLoader()); 
    // 输出结果: sun.misc.Launcher$AppClassLoader@18b4aac2
    System.out.println(test.getClass().getClassLoader().getParent()); 
    //输出结果:sun.misc.Launcher$ExtClassLoader@10f87f48
    System.out.println(test.getClass().getClassLoader().getParent().getParent());
    //输出结果:null ,因为启动类加载器是 C/C++ 语言写的,所以输出为 null
    System.out.println();
}
相关文章
|
5月前
|
安全 前端开发 Java
【JVM的秘密揭秘】深入理解类加载器与双亲委派机制的奥秘!
【8月更文挑战第25天】在Java技术栈中,深入理解JVM类加载机制及其双亲委派模型是至关重要的。JVM类加载器作为运行时系统的关键组件,负责将字节码文件加载至内存并转换为可执行的数据结构。其采用层级结构,包括引导、扩展、应用及用户自定义类加载器,通过双亲委派机制协同工作,确保Java核心库的安全性与稳定性。本文通过解析类加载器的分类、双亲委派机制原理及示例代码,帮助读者全面掌握这一核心概念,为开发更安全高效的Java应用程序奠定基础。
101 0
|
29天前
|
存储 安全 Java
JVM加载过程
JVM类加载过程是Java开发中的关键环节,主要包括五个阶段:加载、验证、准备、解析和初始化。加载阶段获取类的二进制字节流;验证确保字节码符合规范;准备为静态变量分配内存并默认初始化;解析将符号引用转为直接引用;初始化执行静态变量赋值和静态代码块。了解这一过程有助于深入理解Java程序运行机制,提升编程水平。
|
4月前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
120 35
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
|
3月前
|
缓存 前端开发 Java
JVM知识体系学习二:ClassLoader 类加载器、类加载器层次、类过载过程之双亲委派机制、类加载范围、自定义类加载器、编译器、懒加载模式、打破双亲委派机制
这篇文章详细介绍了JVM中ClassLoader的工作原理,包括类加载器的层次结构、双亲委派机制、类加载过程、自定义类加载器的实现,以及如何打破双亲委派机制来实现热部署等功能。
115 3
|
4月前
|
Arthas Java 测试技术
JVM —— 类加载器的分类,双亲委派机制
类加载器的分类,双亲委派机制:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器;JDK8及之前的版本,JDK9之后的版本;什么是双亲委派模型,双亲委派模型的作用,如何打破双亲委派机制
JVM —— 类加载器的分类,双亲委派机制
|
3月前
|
前端开发 Java 应用服务中间件
JVM进阶调优系列(1)类加载器原理一文讲透
本文详细介绍了JVM类加载机制。首先解释了类加载器的概念及其工作原理,接着阐述了四种类型的类加载器:启动类加载器、扩展类加载器、应用类加载器及用户自定义类加载器。文中重点讲解了双亲委派机制,包括其优点和缺点,并探讨了打破这一机制的方法。最后,通过Tomcat的实际应用示例,展示了如何通过自定义类加载器打破双亲委派机制,实现应用间的隔离。
|
5月前
|
数据库 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 应用中集成这两种技术,提高开发效率。
86 0
|
5月前
|
开发者 C# Windows
WPF布局大揭秘:掌握布局技巧,轻松创建响应式用户界面,让你的应用程序更上一层楼!
【8月更文挑战第31天】在现代软件开发中,响应式用户界面至关重要。WPF(Windows Presentation Foundation)作为.NET框架的一部分,提供了丰富的布局控件和机制,便于创建可自动调整的UI。本文介绍WPF布局的基础概念与实现方法,包括`StackPanel`、`DockPanel`、`Grid`等控件的使用,并通过示例代码展示如何构建响应式布局。了解这些技巧有助于开发者优化用户体验,适应不同设备和屏幕尺寸。
171 0
|
5月前
|
安全 前端开发 Java
【JVM 探秘】ClassLoader 类加载器:揭秘 Java 类加载机制背后的秘密武器!
【8月更文挑战第25天】本文全面介绍了Java虚拟机(JVM)中的类加载器,它是JVM的核心组件之一,负责将Java类加载到运行环境中。文章首先概述了类加载器的基本工作原理及其遵循的双亲委派模型,确保了核心类库的安全与稳定。接着详细阐述了启动、扩展和应用三种主要类加载器的层次结构。并通过一个自定义类加载器的例子展示了如何从特定目录加载类。此外,还介绍了类加载器的完整生命周期,包括加载、链接和初始化三个阶段。最后强调了类加载器在版本隔离、安全性和灵活性方面的重要作用。深入理解类加载器对于掌握JVM内部机制至关重要。
198 0
|
6月前
|
存储 前端开发 Java
(二)JVM成神路之剖析Java类加载子系统、双亲委派机制及线程上下文类加载器
上篇《初识Java虚拟机》文章中曾提及到:我们所编写的Java代码经过编译之后,会生成对应的class字节码文件,而在程序启动时会通过类加载子系统将这些字节码文件先装载进内存,然后再交由执行引擎执行。本文中则会对Java虚拟机的类加载机制以及执行引擎进行全面分析。
128 0