JVM之类加载器
类加载器种类
- 启动类加载器(Bootstrap ClassLoader):JVM启动的类加载器,JVM就像一个应用程序,启动时就要靠这个类加载器,相当于JVM的启动器。负责加载$JAVA_HOME/jre/lib/下核心API或者-Xbootclasspath选项指定的jar包,如java.lang.*
- 扩展加载器(Extension ClassLoader):加载位置 :jre\lib\ext中
- 系统类加载器(APP ClassLoader):加载ClassPath下的类,也就是我们程序中定义的类
- 自定义类加载器:必须继承ClassLoader,可以加载我们定义的路径
类加载机制
全盘负责:当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。
父类委托:先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。
缓存机制:缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。这就是为什么修改了Class后,必须重启JVM,程序的修改才会生效。
类加载器使用的模型
双亲委派模型:加载这个类之前,要先加载其父类,父类加载完了,再加载这个类;如果没有父类,就由发起者自行加载,如果子类都加载不了,就会报ClassNotFoundException。
好处:防止类重复加载,父类加载了之后,子类就不用通过自己的ClassLoader加载了。
主动触发类加载的情况
- 创建类的实例,也就是new一个对象
- 访问某个类或接口的静态变量,或者对该静态变量赋值
- 调用类的静态方法
- 反射(Class.forName("com.lyj.load"))
- 初始化一个类的子类(会首先初始化子类的父类)
- JVM启动时标明的启动类,即文件名和类名相同的那个类
类加载流程
JVM把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成JVM可以直接使用的java类的全过程。
仔细分:包含下面7个步骤,加载、验证、准备、解析、初始化、使用、卸载(其中验证、准备、解析合并为连接)
加载
做了下面三步:
- 读class文件:通过类名,导入class文件,得到此类的二进制字节流
- 将类结构加载到方法区:将静态存储结构转化为方法区运行时数据结构
- 生成反射对象:在堆中生成一个该类的class对象(反射对象),作为方法区数据访问的入口
验证
检查class文件的正确性,如不正确会抛VerifyError,检查内容如下:
1. 文件格式验证:验证class文件格式规范,例如: class文件是否已魔术0xCAFEBABE开头 , 主、次版本号是否在当前虚拟机处理范围之内等
2. 元数据验证:这个类是否继承了不允许被继承的类(被final修饰的)、如果这个类的父类是抽象类,是否实现了起父类或接口中要求实现的所有方法。
3. 字节码验证:进行数据流和控制流分析,这个阶段对类的方法体进行校验分析,这个阶段的任务是保证被校验类的方法在运行时不会做出危害虚拟机安全的行为。如:保证访法体中的类型转换有效,例如可以把一个子类对象赋值给父类数据类型,这是安全的,但不能把一个父类对象赋值给子类数据类型、保证跳转命令不会跳转到方法体以外的字节码命令上。
4. 符号引用验证:字段和方法的访问性(private、protected、public、default)是否可被当前类访问。
准备
为静态变量或常量分配存储空间,将其初始化为默认值,这些空间都在方法区中分配。
解析
将虚拟机常量池中的符号引用替换成直接引用。
解析分为以下4类:
- 类或接口解析
- 字段解析
- 方法解析
- 接口方法解析
初始化
初始化阶段会做几件事
- 对静态块、构造函数、父类进行初始化。
- 对准备阶段初始化为默认值的静态变量或常量,进行赋值。
子类和父类加载顺序
如何实现自定义类加载器?
- 继承ClassLoader
- 重写ClassLoader的findClass()方法。
为什么研究类加载全过程?
1. 有助于了解JVM运行过程
2. 更深入了解java动态性(热部署,动态加载),提高程序的灵活性
相关推荐
本部分我们将深入探讨JVM中的类加载器,特别是根类加载器、扩展类加载器和系统类加载器。 首先,让我们了解类加载的基本过程。当JVM启动时,会触发类加载。这个过程分为三个阶段:加载、链接和初始化。加载阶段,类...
例如,当我们尝试加载 `java.lang.Object` 类时,首先会由启动类加载器加载,如果它找不到,会继续交给扩展类加载器,接着是系统类加载器,最后才会由用户自定义的类加载器尝试加载。 1.3 类加载双亲委派示例 为了...
Java代码执行流程是JVM的核心流程之一,它首先通过编译器把Java代码转换成字节码,然后通过类加载器加载到内存中,并将其放在运行时数据区的方法区内。最后,执行引擎将字节码翻译成底层系统指令,再交由CPU去执行。
Java中的类加载器是JVM(Java虚拟机)的核心组件之一,它们负责将.java源代码编译成的.class字节码文件加载到JVM中,从而使得程序能够运行。类加载器不仅涉及到程序的正常执行,还与Java的动态加载、模块化系统以及...
JVM使用类加载器(ClassLoader)来完成这一任务。在Java中,每个类都由一个对应的ClassLoader实例负责加载。默认的类加载器包括Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和...
Java类加载器是JVM的重要组成部分之一,它负责查找并加载类文件到JVM的内存空间中。Java程序的运行依赖于类加载器将`.class`文件加载到JVM中,并对其进行验证、准备和解析等步骤,最终使类能够在JVM中执行。 #### ...
Java的类加载器是Java虚拟机(JVM)的核心组件之一,它负责将类的字节码从磁盘、网络或其他数据源加载到内存中,并转换为可执行的Java对象。类加载器不仅关乎程序的运行,还在实现动态加载、插件系统等方面发挥着...
Java应用程序类加载器是Java平台的核心组成部分之一,它负责加载应用程序中的类到JVM(Java虚拟机)中,使得程序能够执行。理解类加载器的工作原理对于深入学习Java编程至关重要。在Java中,类加载器按照层次结构...
1. **引导类加载器(Bootstrap Class Loader)**:这是JVM启动时的第一个加载器,负责加载`rt.jar`中的核心类,例如`java.lang.Object`。由于它是内置于JVM的,因此在API文档中没有直接描述,返回`null`给`...
"深入理解JVM之类加载机制详解" 本文主要介绍了深入理解JVM之类加载机制的知识点,结合实例形式详细分析了类加载机制原理、过程及相关操作注意事项。 1. 类加载机制概述 类加载机制是Java虚拟机把描述类的数据从...
Java中有三个类加载器,问题就来了,碰到一个类需要加载时,它们之间是如何协调工作的?在这里,Java采用了委托模型机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙...
### JVM之走进类加载 #### 一、Java及JVM简介 Java自1995年由Sun Microsystems发布以来,便迅速成为了最受欢迎的编程语言之一。根据TIOBE语言热度排行榜,Java持续保持在前列,这证明了其在编程领域的持久影响力。...
每个线程都有一个与之关联的类加载器,可以通过Thread.currentThread().getContextClassLoader()获取。这在某些情况下非常有用,例如在Web应用服务器中加载特定Web应用的类。 在Web容器(如Tomcat)中,每个Web应用...
值得注意的是,启动类加载器是由C++语言实现的,是Java虚拟机(JVM)的一部分,因此用户无法直接引用它。其主要特点包括: 1. **加载范围**:启动类加载器加载的类库通常包括`rt.jar`等核心类库,这些类库对Java...
Java 类加载器是Java语言的核心特性之一,它允许程序在运行时动态地加载类到Java虚拟机(JVM)中。这一特性对于实现模块化、插件化和动态部署等功能至关重要。类加载器的设计遵循“分层加载”原则,形成了一个树状的...
类加载器是Java最强大的特征之一。但是开发者常常忘记类加载组件。类加载器是在运行时负责寻找和加载类文件的类。Java允许使用不同的类加载器,甚至自定义的类加载器。类加载器从源文件(通常是.class 或 .jar文件)...
Java 类加载器是Java虚拟机(JVM)的重要组成部分,它负责查找并加载类的字节码到JVM中执行。理解类加载器的工作原理对于深入学习Java平台、优化应用程序性能以及实现自定义加载器至关重要。 1. **类加载器层次结构...
深入详解JVM之类加载器深度剖析, Javascript, Node,