类加载具体机制可以参考: Java类加载机制: https://zhuanlan.zhihu.com/p/25228545 JVM 基础 - Java 类加载机制: https://www.pdai.tech /md/java/jvm/java-jvm-classload.html 2 类加载机制 2.1 双亲委派机制 双亲委派机制是指如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成 4. 自定义类加载器(User ClassLoader), 如果有必要,我们还可以加入自定义的类加载器。 2.2 全盘负责机制 当一个类加载器负责加载某个 Class 时,该 Class 所依赖的和引用的其他 Class 也将由该类加载器负责载入,除非显式使用另外一个类加载器来载入。 结合类加载机制中的全盘负责机制,我们知道这个匿名类是由加载依赖它的 org.apache.iotdb.MySum 的类加载器来加载的,我们把这个类加载器记为 A。
类加载机制 类的加载过程总的来说分为7个过程:加载,验证,准备,解析,初始化,使用,卸载,其中类的验证,准备,解析又称为连接阶段 java虚拟机规范并没有规定什么时候要进行加载阶段,但是规定了什么时候必须进行初始化阶段 3,反射调用的时候 4,main方法所在的类,最先初始化。 类加载器只用于实现类的加载动作。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。 >\lib\ext目录中的类库加载到虚拟机内存中 应用程序类加载器:它负责加载用户类路径(ClassPath)上所指定的类库 双亲委派机制 类加载器之间如下图的这种层次关系,称为类加载器的双亲委派模型。 双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中
1.访问类的编译期静态常量时,不会触发类的初始化行为。类的初始化行为是指在类被加载之后(也就是类的Class对象被创建之后),为类的静态成员变量分配存储空间。 2.编译期静态常量会在编译阶段被存储到NonInitialization类的常量池中,在以后对编译期静态常量的引用都实际上被替换为对NonInitializaion类对自身常量池的引用,所以访问类的编译期静态常量并不会触发类的初始化行为 3.初始化一个类之前,会先初始化该类的父类。
类加载机制 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。 加载阶段既可以使用Java虚拟机里内置的类加载器来完成,也可以由用户自定义的类加载器去完成,开发人员通过定义自己的类加载器去控制字节流的获取方式(重写一个类加载器的findClass()或loadClass 验证阶段对于虚拟机的类加载机制来说,是一个非常重要的、但却不是必须要执行的阶段,因为验证阶段只有通过或者不通过的差别,只要通过了验证,其后就对程序运行期没有任何影响了。 下面讲解前4种引用的解析过程 类或接口的解析 假设当前代码所处的类为D,如果要把一个从未解析过的符号引用N解析为一个类或接口C的直接引用,那虚拟机完成整个解析的过程需要包括以下3个步骤: 如果C不是一个数组类型 方法解析 方法解析的第一个步骤与字段解析一样,也是需要先解析出方法表的class_index[4]项中索引的方法所属的类或接口的符号引用,如果解析成功,那么我们依然用C表示这个类,接下来虚拟机将会按照如下步骤进行后续的方法搜索
点击上方“晏霖”,选择“置顶或者星标” 曾经有人关注了我 后来他有了女朋友 1.6类加载机制 1.6.1概述 学习本章前我们要对类文件结构有一个简单的认识,而学习类文件结构没有任何难度,更多的是参考《 没有经历初始化的类使用了java.lang.reflect进行反射调用。 3. 当初始化类的时候,发现其父类还没有初始化,则先对其父类进行初始化。 4. n 验证 验证是连接的第一步,这个阶段主要是校验class文件的字节流包是否符合《Java虚拟机规范》所规定的,是虚拟机自身保护的机制。 图1-33 静态代码块与静态方法字节码文件示例 1.6.4类加载器 在讲类加载过程的加载阶段时提到过类加载器,类加载器的作用就是实现加载阶段的任务,通过一个类的全限定名获取Class文件的二进制字节流, 代码清单1-2 类加载机制源码 //ValueUtility.java static { SharedSecrets.setJavaCorbaAccess(new JavaCorbaAccess
事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的类加载机制。 对于jvm类的加载机制,我们主要关注两个问题: 类的加载时机?(初始化的五种情况) 类的加载过程? (类的五个加载过程) 二、类的加载时机 1.类的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括加载、验证、准备、解析、初始化、使用和卸载。 2.类的加载时机 这里的“加载”只是类加载过程的一个阶段,代表这“类的加载”的这一过程的开始,jvm并没有强制性约束在什么时候开始类加载过程。 一般我们说类的加载,指的是整个加载过程。 4.解析 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。
类加载机制 虚拟机把描述类的数据从class文件加载到内存,并且进行校验、解析、初始化。最终形成可以直接使用的Class对象,这就是类加载机制。 当用户在自己的代码中,需要某些额外的类时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。 下面将讲解前面4种引用的解析过程。 根据类加载机制,当被加载的类引用了另外一个类的时候,需要使用第一个类的类加载器进行加载。 from=singlemessage [Tomcat类加载器机制
Java类加载机制是指 JVM 把类的字节码文件加载到内存,并进行链接和初始化的过程。 加载加载是“类加载”(Class Loading)过程的一个阶段,是通过双亲委派机制进行类的加载。 对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。类加载器可分为启动类加载器、扩展类加载器和应用类加载器。 它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。 类加载模型双亲委派模型如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中
类加载机制 类加载指的是,Java 进程运行的时候,需要把 .class 文件从硬盘读取到内存,并进行一些列的校验解析的过程(程序要想执行,就得进入内存) .class 文件==>类对象 硬盘==>内存 类加载过程 类加载的过程,其实是在 Java 官方文档中给出的说明 加载:找到. class 文件,并且读文件内容 验证:校验 .class 文件的格式是否符合 JVM 规范要求 准备:给类对象分配内存 (此时内存空间全是 0 的==>类的静态成员也就是全 0 的值) 解析:针对类中的字符串常量进行处理 把类对象的各个属性进行赋值填充==>触发对父类的加载,初始化静态成员,执行静态代码块 类加载大体的过程可以分为五 准备 给类对象申请内存空间 此时申请到的内存空间,里面的默认值,都是全 0 的。(这个阶段中,类对象里的静态成员变量的值也就相当于是 0) 4. 初始化 针对类对象完成后续的初始化 还要执行静态代码块的逻辑,还可能会触发父类的加载
概述 虚拟机的类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。 遇到 invokestatic 字节码指令(调用一个类的静态方法的时候) [4] 反射调用 [5] 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化 表示‘创建数组’的助记符 [1]『MyParent4[] myParent4s = new MyParent4[1]』对应的字节码文件代码: ? [3] 从zip,jar等归档文件中加载’.class’文件 [4] 从专有数据库中读取。 ② 元数据验证; ③ 字节码验证; ④ 符号引用验证 对于虚拟机的类加载机制来说,验证阶段是一个非常重要的、但不是一定必要(因为对程序运行期没有影响)的阶段。
类的加载: 查找并加载类的二进制数据 加载是类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情: 【1】通过一个类的全限定名来获取其定义的二进制字节流。 类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误 加载 .class文件的方式: 【1】从本地系统中直接加载; 【2】通过网络下载 .class文件; 【3】从zip,jar等归档文件中加载 .class文件; 【4】从专有数据库中提取 .class 【4】符号引用验证:确保解析动作能正确执行。 : 【1】创建类的实例,也就是 new的方式; 【2】访问某个类或接口的静态变量,或者对该静态变量赋值; 【3】调用类的静态方法; 【4】反射(如Class.forName("com.pdai.jvm.Test
JVM类加载机制 java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的加载机制。 (2)加载.class文件的方式 1.从本地系统中直接加载 2.通过网络下载.class文件 3.从zip,jar等归档文件中加载.class文件 4.从专有数据库中提取.class 4.解析(Resolution) 将符号引用转成直接引用 符号引用 符号引用与虚拟机实现的布局无关,引用的目标并不一定要加载到内存中。 4.接口方法解析 与类方法解析步骤类似,只是接口不会有父类,因此,只递归向上搜索父接口就行了。 5.初始化(Initialization) 对类的静态变量,静态代码块执行初始化操作 步骤: 1.加入这个类还没有被加载和连接,则程序先加载并连接该类 2.加入该类的直接父类还没有被初始化,则先初始化其直接父类
在沙箱组件中包括类装载器结构,类加载器体系结构也是java沙箱的第一道防线,因为程序都是通过类加载器才能够加载到JVM中的。 类加载器有三方面的作用: 1. 它防止了恶意代码去干涉善意代码 2. 其中一个大家所熟悉的词就是“双亲委派机制”,所谓“双亲委派机制”,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。 关于java类加载机制推荐大家看这篇文章《深入探讨 Java 类加载器》,IBM文档,写的很详细。
在加载类的时候,是采用的双亲委派机制,即把请求交给父类处理的一种任务委派模式。工作原理(1)如果一个类加载器接收到了类加载的请求,它自己不会先去加载,会把这个请求委托给父类加载器去执行。 下面给大家列举一下,破坏双亲委派机制最常见的场景。3.1 JNDIJNDI是Java中的标准服务,它的代码由启动类加载器去加载。 有了线程上下文加载器,JNDI服务就可以使用它去加载所需要的SPI代码,也就是父类加载器请求子类加载器去完成类加载的动作,这样就打破了双亲委派机制。 也就是说,有些公共的依赖包,最好能够只加载一次。我们还需要将Tomcat本身的类,跟Web应用的类隔离开。这些原因导致,Tomcat没有办法使用传统的双亲委派机制加载类了。 那么,Tomcat加载类的机制是怎么样的?CommonClassLoader:是Tomcat最基本的类加载器,它加载的类可以被Tomcat容器和Web应用访问。
类加载机制:虚拟机把描述类的数据从class文件加载到类,并对数据进行校验、转换解析、初始化,最终形成可以被虚拟机直接使用的java类型。 类加载过程 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。 类加载器 说到加载,那jvm是怎么把这些数据加载到内存的呢?答案是:通过类加载器。java中提供了这么几种类加载器: 启动类加载器:Bootstrap ClassLoader,跟上面相同。 双亲委派模型 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时 例如,类java.lang.Object类存放在JDK\jre\lib下的rt.jar之中,因此无论是哪个类加载器要加载此类,最终都会委派给启动类加载器进行加载,这边保证了Object类在程序中的各种类加载器中都是同一个类
1、描述类的加载过程及各个步骤的主要工作? 答: 类的加载过程可以大体分为三个大的阶段:加载、连接、初始化。其中,连接阶段又可以细分为:验证、准备、解析这三个阶段。 答:当某个类加载器在接到加载类的请求时,会将加载任务委托给父类加载器,依次递归,父类加载器可以完成类加载任务,就成功返回;不能加载则子类加载器自己完成加载。 有3类加载器: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用程序类加载器(Application ClassLoader ) 但用户还可以自定义类加载器。 意义:双亲委派避免类的重复加载问题,以及避免Java核心的API被篡改,保证了代码安全。
这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情 类加载机制 JVM的类加载机制主要有3种,全盘负责/双亲委派/缓存机制。 双亲委派 所谓的双亲委派,则是先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。 通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成类加载任务,就成功返回;只有父加载器无法完成此加载任务时,才自己去加载。 缓存机制 缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据 双亲委派 双亲委派机制的优势:采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader
类加载过程 加载 连接 验证 准备 解析 初始化 加载 获取类的二进制字节流加载到内存(比如从Zip包,网络,反射中读取) 将字节码的静态数据结构转换成运行时数据结构 在内存中生成一个代表这个类的java.lang.Class (JVM的自我保护机制) 正常运行Java程序可以通过.java编译成class文件,然后交由JVM执行。编译器虽然本身可以检测Java的安全问题。 类加载器 启动(Bootstrap)类加载器 启动类加载器主要加载的是JVM自身需要的类,它负责将 /lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中 这个类加载使用 双亲委派模型的流程: 当一个类加载器收到类加载的请求,首先会把请求委派给父类加载器去加载,因此最终的请求都会发给启动类加载器(Bootstrap ClassLoader)。 【举个例子】每个类都有一个共同的父类Object,每个类在被加载时都会先去加载Object类,按照双亲委派模型的思路,所有的类都会优先被启动类加载器加载,那么也就是说只需要加载一次Object,当其他类需要
类得生命周期 在讲类的加载机制前,我们都知道一个对象的生命周期指的是这个对象从创建到销毁的过程,这个国政简单的一句话概括:从JVM将字节码文件加载进内存到卸载出内存为止。 public static void mian(string args[]){ System.out.println(i); } } 在这里如果你的答案是0,那么恭喜你,你的类加载机制还需要看个四五遍 在此本章说明类加载机制已经全部说完,集中类初始化时机也有所是举例,但是还有一种特俗的情况,见如下代码: public class FinalTest{ public static void main 下面附上对象得初始化时机: 使用new关键字创建对象 使用Class类的newInstance方法(反射机制) 使用Constructor类的newInstance方法(反射机制) 使用Clone方法创建对象 使用(反)序列化机制创建对象
4、符号引用验证,保证解析能正常执行(符号引用中通过字符串描述的全限定名是否能找到对应的类;符号引用中的类、字段、方法的访问性是否可悲当前类访问)。 1、类和接口的解析。 2、字段的解析。 3、类方法解析。 4、接口方法解析。 3、初始化类时,有父类则先初始化父类。 4、虚拟机启动时,先初始化主类(包含main()方法)。 5、JDK 1.7动态语言支持,MethodHandle实例解析结果方法句柄对应的类要先初始化。 如果一个类加载器收到了类加载的请求,首先不会自己尝试去加载这个类,而是将请求委派给父类加载器去完成,所有的加载请求最终都传送到启动类加载器,只有父加载器反馈无法加载,子加载器才会尝试自己加载。 双亲委派模型的特殊情况: 1、代码热替换、模块热部署,OSGi实现模块化热部署的关键是它自定义的类加载器机制的实现。