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();
}
相关文章
|
3天前
|
前端开发 安全 Java
深入浅出JVM(八)之类加载器
深入浅出JVM(八)之类加载器
|
3天前
|
存储 缓存 安全
JVM 类的加载篇
JVM 类的加载篇
20 0
|
3天前
|
前端开发 Java 开发者
JVM类加载器的分类以及双亲委派机制
JVM类加载器的分类以及双亲委派机制
|
3天前
|
Java
[JVM] Java类的加载过程
[JVM] Java类的加载过程
[JVM] Java类的加载过程
|
3天前
|
监控 前端开发 安全
JVM工作原理与实战(十四):JDK9及之后的类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了JDK8及之前的类加载器、JDK9及之后的类加载器等内容。
27 2
|
3天前
|
监控 Java 关系型数据库
JVM工作原理与实战(十三):打破双亲委派机制-线程上下文类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了打破双亲委派机制的方法、线程上下文类加载器等内容。
24 2
|
3天前
|
监控 安全 前端开发
JVM工作原理与实战(十二):打破双亲委派机制-自定义类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了打破双亲委派机制的方法、自定义类加载器等内容。
19 1
|
3天前
|
监控 安全 Java
JVM工作原理与实战(十):类加载器-Java类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了扩展类加载器、通过扩展类加载器去加载用户jar包、应用程序类加载器等内容。
29 4
|
3天前
|
监控 安全 Java
JVM工作原理与实战(九):类加载器-启动类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了启动类加载器、通过启动类加载器去加载用户jar包等内容。
32 8
|
3天前
|
Arthas 安全 Java
JVM工作原理与实战(八):类加载器的分类
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类加载器、类加载器的分类等内容。
19 4