当前位置: 首页 > news >正文

JVM类加载器

一、类加载机制

(1)什么情况会触发类加载?
        1.类的静态属性被访问
        2.类的静态方法被调用
        3.使用类实例化对象
        4.子类被用到时
        5.反射、注解

(2)类加载器的分类

  1. 启动类加载器(Bootstrap Class Loader)是优先级最高的加载器,最先进行加载。负责加载JDK目录/jre/lib 中相关jar包。包含了所有核心类,例如:String、System等。
  2. 扩展类加载器(Extension Class Loader):负责加载扩展类。具体就是JDK目录/jre/lib/ext。
  3. 应用程序加载器(Application Class Loader)负责加载类路径中字节码文件。也就是平时我们所说的classpath中内容

(3) 类的生命周期

  1. 加载(Loading)

  2. 链接(Linking)

    1. 校验(verify):校验加载的字节码文件是否正确。

    2. 准备(prepare):所有静态变量初始化并赋予默认值。

    3. 解析(resolve) : 把符号引用转换为直接引用。

  3. 初始化(Initialization):执行静态代码块和静态变量赋值。

  4. 运行。运行字节码文件。

  5. 卸载。运行结束后进行卸载。

二、类加载器源码分析 

(1)Launcher类介绍sun.misc.Launcher 是JVM的入口类。

比较重要的就是启动类加载器加载的路径和ClassLoader类对象。

 (2)ClassLoader介绍

ClassLoader是Java中提供的类加载器父类。所有的类加载器都是这个类的子类或子孙类。

提供了全局属性parent,这意味着类加载器之间具有逻辑父子关系(不是继承关系)

(3)获取类加载器

可以通过:类名.class.getClassLoader()进行查看类是由哪种加载器进行加载。getClassLoader()返回值为ClassLoader类对象。

其中:类.class 表示获取字节码文件对象。类.class.getClassLoader()表示由哪个加载器对象加载这个字节码文件。

(4)获取父加载器

ClassLoader中包含getParent()方法,表示获取当前加载器的父加载器。

package com.java.test;

public class Test08 {
    public static void main(String[] args) {
        ClassLoader classLoader = Stu.class.getClassLoader();
        System.out.println(classLoader);//jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc
        ClassLoader parent = classLoader.getParent();
        System.out.println(parent);//jdk.internal.loader.ClassLoaders$PlatformClassLoader@48140564
        ClassLoader parent1 = parent.getParent();
        System.out.println(parent1);//null
    }
}

(5)为什么ExtClassLoader的父加载器是null

在Launcher中并没有BootstrapClassLoader类。因为Java中并没有提供BootstrapClassLoader类,而是通过C/C++语言编写的。既然Java中没有这个类所以我们在获取ExtClassLoader的父加载器时自然为null。

(6)类加载的父子关系应该是下面的父子关系

 (7)全盘负责委托机制

这是类加载的一种机制。即:当一个ClassLoader加载一个类时,除非明确指定,否则这个类所依赖和引用的类也由这个ClassLoader进行加载。

(8)双亲委派机制

双亲委派机制在代码中体现可以通过java.lang.ClassLoader中的loadClass()方法进行查看。

1. 委派的过程就是一层一层向上找的过程。只要当前加载器加载过,就不会重新加载。如果没有加载过,会向上寻找是否加载过。

2. 当加载到Bootstrap ClassLoader后会一层一层的向下判断是否可以进行加载,如果能加载则加载。如果不能加载向下一层寻找下个加载器是否能加载。如果到最后一层都无法加载则报ClassNotFoundException。

优点:避免重复加载(加载一次就不加载)和避免核心类的串改(优先Bootstrap classloader)

相关文章:

  • 路由引入基本概念
  • centos安装Nginx
  • 学习笔记18--自动驾驶智能化指标评测体系(上)
  • 《Mycat分布式数据库架构》之配置详解
  • springboot bean找不到问题
  • [河北银行 2022 CTF]
  • 通过数据库建表实战来理解数据库知识
  • 200A FS3L200R10W3S7FB11 EasyPACK 950V IGBT模块
  • 微信小程序知识点汇总
  • 用于标记和纯化的325143-98-4,Biotin-SS-Sulfo-NHS ester生物素化 试剂
  • 多御安全浏览器全新chromium95内核全面兼容
  • opencv图像滤波
  • SAP事务码开关控制,TCODE
  • 关于WebGL,Three.js,OpenGL,Direct3D,CSS3D,GPU
  • 武汉星起航跨境:北京商务局发文,明确促进跨境电子商务发展
  • __proto__ 和 prototype的关系
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Consul Config 使用Git做版本控制的实现
  • IDEA 插件开发入门教程
  • JavaScript 基本功--面试宝典
  • JavaScript的使用你知道几种?(上)
  • JavaScript新鲜事·第5期
  • Java基本数据类型之Number
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • orm2 中文文档 3.1 模型属性
  • PAT A1120
  • Shadow DOM 内部构造及如何构建独立组件
  • Shell编程
  • Spring Cloud Feign的两种使用姿势
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从0到1:PostCSS 插件开发最佳实践
  • 给Prometheus造假数据的方法
  • 解析 Webpack中import、require、按需加载的执行过程
  • 七牛云假注销小指南
  • 深度学习中的信息论知识详解
  • 为视图添加丝滑的水波纹
  • 学习使用ExpressJS 4.0中的新Router
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)ssm高校实验室 毕业设计 800008
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原)本想说脏话,奈何已放下
  • (转)http协议
  • .gitignore
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .Net7 环境安装配置
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ C++ ] STL---string类的使用指南
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • []Telit UC864E 拨号上网
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C/C++]数据结构 堆的详解