类加载机制 骑猪看日落 2022-12-26 10:26 177阅读 0赞 ## 1.类加载流程 ## ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1ZWd1Y2hlbg_size_16_color_FFFFFF_t_70] **流程步骤:** 1. **加载**:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的 main()方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的 java.lang.Class对象,作为方法区这个类的各种数据的访问入口 2. **验证**:校验字节码文件的正确性 3. **准备**:给类的静态变量分配内存,并赋予默认值 4. **解析**:将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如 main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过 程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用 5. **初始化**:对类的静态变量初始化为指定的值,执行静态代码块 例:加载一个User类 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1ZWd1Y2hlbg_size_16_color_FFFFFF_t_70 1] 类被加载到方法区中后主要包含**运行时常量池**、**类型信息**、**字段信息**、**方法信息**、**类加载器的引用**、**对应class实例的引用**等信息 类加载器的引用:这个类到类加载器实例的引用 对应class实例的引用:类加载器在加载类信息放到方法区中后,会创建一个对应的Class 类型的对象实例放到堆(Heap)中, 作为开发人员访问方法区中类定义的入口和切入点 **注意**: 主类在运行过程中如果使用到其它类,会逐步加载这些类(懒加载) ## 2. 类加载器 ## #### 2.1 类加载器的分类 #### 1. **引导类加载器**:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如 rt.jar、charsets.jar等 2. **扩展类加载器**:负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR 类包 3. **应用程序类加载器**:负责加载ClassPath路径下的类包,主要就是加载自定义的那些类 4. **自定义加载器**:负责加载用户自定义路径下的类包 #### 2.2 类加载器初始化过程 #### 初始化过程会创建JVM启动器实例sun.misc.Launcher sun.misc.Launcher初始化使用了单例模式设计,保证一个JVM虚拟机内只有一个 sun.misc.Launcher实例 而在Launcher构造方法内部,其创建了两个类加载器 * sun.misc.Launcher.ExtClassLoader(扩展类加载器) * sun.misc.Launcher.AppClassLoader(应用类加载器) JVM默认使用Launcher的getClassLoader()方法返回的类加载器AppClassLoader的实例加载应用程序 ## 3. 双亲委派机制 ## JVM中的类加载器是有亲子层级结构的 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1ZWd1Y2hlbg_size_16_color_FFFFFF_t_70 2] **双亲委派机制**: 加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类 简单来说,即是先找父亲加载,不行再由儿子自己加载 **双亲委派机制的必要性**: * 沙箱安全机制:比如自己写的java.lang.String.class类是不会被加载,这样便可以防止核心 API库被随意篡改 * 避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一 次,保证被加载类的唯一性 **全盘负责委托机制:** “全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及引用的类也由这个ClassLoder载入 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1ZWd1Y2hlbg_size_16_color_FFFFFF_t_70]: /images/20221120/38c951adcd194c5c90683dbaf00e0583.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1ZWd1Y2hlbg_size_16_color_FFFFFF_t_70 1]: /images/20221120/08adef0113324fe8a93e9747b8362522.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1ZWd1Y2hlbg_size_16_color_FFFFFF_t_70 2]: /images/20221120/6207f8cb207d4f728a99748c9d96fdb5.png
相关 类加载机制 1.类加载流程 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG 骑猪看日落/ 2022年12月26日 10:26/ 0 赞/ 178 阅读
相关 类加载机制 一、类加载的几个阶段 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9i 末蓝、/ 2022年12月25日 15:54/ 0 赞/ 198 阅读
相关 类加载机制 点击上方“晏霖”,选择“置顶或者星标” 曾经有人关注了我 后来他有了女朋友 1.6类加载机制 1.6.1概述 学习本章前我们要对类文件结构有一个简单的认识,而学 迷南。/ 2022年12月22日 11:16/ 0 赞/ 188 阅读
相关 类加载机制 我们都知道java中比较常提到的一个概念就是类。但是在java机制中,类是怎么运行的呢?下面来看看L: 类被加载到虚拟机到使用,最后被卸载,经历了一下几个步骤: ╰+哭是因爲堅強的太久メ/ 2022年07月13日 09:10/ 0 赞/ 260 阅读
相关 类加载机制 类加载器层次是怎么样的 1. JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 `<J - 日理万妓/ 2022年07月12日 07:15/ 0 赞/ 284 阅读
相关 类加载机制 类加载器层次是怎么样的 1. JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 `<J Bertha 。/ 2022年07月12日 07:15/ 0 赞/ 227 阅读
相关 类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、 转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 待我称王封你为后i/ 2022年07月12日 05:59/ 0 赞/ 266 阅读
相关 类加载机制 任何一个类在使用前都要经历过完整的加载,连接和初始化三个类加载步骤。经历过这三个步骤之后类型就能随时随地被使用了。从一个类型被加载进JVM算起,直至最终被卸载出内存为止,它的整 左手的ㄟ右手/ 2022年06月10日 06:47/ 0 赞/ 309 阅读
相关 类加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个`java.lang.Class`对 骑猪看日落/ 2022年05月27日 05:08/ 0 赞/ 304 阅读
相关 类加载机制 java类加载的全过程包含5个步骤: 加载,验证,准备,解析,初始化 而验证,准备,解析又可以合并为一个阶段:连接 怼烎@/ 2021年10月01日 08:26/ 0 赞/ 434 阅读
还没有评论,来说两句吧...