【Java 】Java 类加载和类加载器

news2024/11/26 0:50:23

文章目录

  • 前言
  • 一、加载
  • 二、链接
    • 验证
    • 准备
    • 解析
  • 三、初始化
    • 发生的时机
    • 不会触发类的初始化
  • 四、类加载器
    • 双亲委派模式

前言

Java 的类加载阶段分为:加载、链接、初始化,而链接的过程中包括:验证、准备、解析。

一、加载

将类的字节码载入方法区中,内部采用 C++ 的 instanceKclass 描述 Java 类

instanceKclass 的重要字段:

  • _java_mirror:Java 类镜像,存放类对象的地址,例如对于 String,存放的就是String.class
  • _super:即父类
  • _methods:即方法
  • _constants:即常量池
  • _class_loader:类加载器
  • _vtable:虚方法表
  • _itable:接口方法表

在这里插入图片描述

二、链接

链接阶段包括验证、准备、初始化三个部分

验证

验证类是否符合 JVM 规范,进行安全性检查,例如:检查 Java 文件的魔数

准备

为 static 变量分配地址空间,设置默认值

  • static 变量分配空间和赋值是两个步骤,分配空间是在准备阶段完成,而赋值是在初始化阶段完成;
  • 若 static 变量是 final 类型的,且变量类型为基本数据类型或者字符串对象,则在准备阶段进行赋值;
  • 若 static 变量是 final 类型的,且变量类型为引用对象,则仍在初始化阶段进行赋值;

解析

将常量池中的符号引用解析为直接引用

三、初始化

初始化调用 ()v,即执行类的构造方法,代码块等,虚拟机会保证这个类的线程安全

发生的时机

概括的说,类的初始化是懒惰的

  • main 方法所在的类,总会被首先初始化;
  • 首次访问类的静态变量或者静态方法,因为这些变量不是 final 的,会在类的初始化阶段进行赋值;
  • 子类初始化,会引起父类的初始化;
  • 子类方法父类的静态变量,会导致父类的初始化;
  • Class.forName;
  • new 会导致初始化;

不会触发类的初始化

  • 访问类的 static final 静态变量(基本类型和字符串),不会被初始化,因为这些变量的赋值是在准备阶段;
  • 类对象.class 不会触发类的初始化;
  • 创建该类的数组不会触发初始化;
  • 类加载器的 loadClass 方法;
  • Class.forName 的参数 2 为 false 时

四、类加载器

以 JDK8 为例

名称加载哪里的类说明
Bootstrap ClassLoaderJAVA_HOME/jre/lib无法直接访问
Extension ClassLoaderJAVA_HOME/jre/lib/ext上级为 Bootstrap ClassLoader,访问为 null
Application ClassLoaderclasspath上级为 Extension ClassLoader
自定义类加载器自定义上级为 Application ClassLoader

类加载器的作用:加载类的二进制字节码

双亲委派模式

双亲委派模式是一种Java类加载机制,它定义了一种层次化的父子关系,由父类加载器向下委派请求,直到找到合适的类加载器为止。

  • 首先会检查缓存,查找该加载器是否已经加载过这个类了,如果没有就去父类的加载器中去寻找;
  • 如果缓存中没有找到,就会自顶而下用的类加载器去创建该类;
  • 最终返回该类即可;
protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            // 检查缓存,是否已经加载过这个类
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        // 向上级的累加器中找
                        c = parent.loadClass(name, false);
                    } else {
                        // 向 Bootstrap 类加载器中找
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
            	// 如果缓存没有找到,就去创建
                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    // 调用 findClass 去创建类
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3新拟态组件库开发流程——table组件源码

基础表格 首先开发table组件之前&#xff0c;先想好要用什么样式的api&#xff0c;因为笔者在生产工作中用的都是element&#xff0c;所以前面几个组件风格和element类似&#xff0c;但是这次不打算用element的风格了&#xff0c;打算换一种&#xff0c;直接展示&#xff1a; …

LinkedHashMap顺序迭代原理与LRU算法实现

一、LinkedHashMap与HashMap的结构区别 HashMap LinkedHashMap 结构区别&#xff1a;LinkedHashMap的元素Entry中多两个用于维护双向链表的指针before、after&#xff0c;并且在LinkedHashMap中有两个head、tail指针用于记录双向链表的头结点和尾结点。 二、LinkedHashMa…

2.3 定点乘法运算

学习目标&#xff1a; 如果我要学习定点乘法运算&#xff0c;我会按照以下步骤进行学习&#xff1a; 确定学习目标&#xff1a;明确学习定点乘法运算的目的和重点&#xff0c;以便有针对性地进行学习。 掌握基础知识&#xff1a;首先需要了解定点数和定点乘法的基础知识&…

【halcon】半透明和棋盘格(未完成)

背景 想实现一个这样的效果&#xff1a; 但是发现设置HSmartWindowControlWPF 的Background 根本就没有反应。 探索过程 于是就换个思路&#xff0c;把棋盘格画到Border里面。 <Border Grid.Row"1" Grid.ColumnSpan"2" Panel.ZIndex"0" >…

MySQL:数据库的基本操作

MySQL是一个客户端服务器结构的程序, 一.关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 主流的关系型数据库包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2 等. …

mitmproxy抓包

0.mitmproxy功能简介 实时拦截、修改 HTTP/HTTPS 请求和响应可保存完整的 http 会话&#xff0c;方便后续分析和重放支持反向代理模式将流量转发到指定服务器支持 macOS 和 Linux上的透明代理模式支持用 Python 脚本对 HTTP 通信进行修改 1. 安装mitmproxy pip3 install mit…

wow.js scrollReveal.js 动画库 使用详解以及优劣

wow.js 1.简介 有的页面在向下滚动的时候&#xff0c;有些元素会产生细小的动画效果。比如需要做到滚动条滑到某个位置时&#xff0c;才能显示动画。wow.js 依赖 animate.css&#xff0c;所以它支持 animate.css 多达 60 多种的动画效果&#xff0c;能满足您的各种需求。 IE6、…

Python+Qt掌纹识别

程序示例精选 PythonQt掌纹识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonQt掌纹识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

安卓GB28181-2022 RTP over TCP

使用TCP传输RTP包&#xff0c;GB28181-2016和GB28181-2022 都是按IETF RFC4571来的。使用TCP发送RTP包&#xff0c;前面加个16位无符号长度字段就好(网络字节序)。具体定义格式如下&#xff1a; 需要注意的是LENGTH值可以是0&#xff0c;0的话表示空包; 另外UDP传输RTP包&#…

【华为云主机迁移服务SMS,使用指南 (linux版本)】

文章目录 华为云主机迁移服务SMS,使用指南 (linux版本)1.迁移前准备工作1.1 必要条件1.2 准备 (注意切换浏览器) 2.在源端(A服务器)安装Agent (linux版), 连接到B的华为云SMS3.设置目的端(B服务器)--在B浏览器内操作4.开始服务器复制5.启动目的端 (B)6.其他非必要操作 华为云主…

KDZD地埋线短路漏电试扎器

一、产品背景 多年以来&#xff0c;电力电缆的维护迁移过程中的识别与刺孔&#xff0c;均按照行业标准DL409-91《电业安全工作规程&#xff08;电力线路部分&#xff09;》第234条要求&#xff0c;采用人工刺孔&#xff0c;一旦电缆识别出错&#xff0c;误刺孔带电电缆将对人身…

就现在!体验高科技的虚拟孪生

01 行业创新已成大势所趋 世界进入工业复兴大约已有十余载&#xff0c;众多行业开始向数字化转型&#xff0c;尖端技术取代了老旧的数字技术。对于制造商而言&#xff0c;在将运营控制在预算范围内的同时&#xff0c;保持满足这些需求所需的产量&#xff0c;是一项巨大的挑战。…

JS-11G/11端子排静态时间继电器 JOSEF约瑟 导轨安装

JS-11G系列端子排静态时间继电器品牌&#xff1a;JOSEF约瑟名称&#xff1a;端子排静态时间继电器型号&#xff1a;JS-11G工作电压&#xff1a;48,110,220V返回时间&#xff1a;≤20mS延时范围&#xff1a;0.02S~999M 系列型号&#xff1a; JS-11G1端子排静态时间继电器&…

【英语】2023 全国大学生英语竞赛NECCS相关准备

文章目录 1、比赛基本信息2、大赛题型和分值3、如何准备4、2023年全国大学生英语竞赛样题(C级)&#xff0c;满分150Part1. 听力&#xff08;30分钟&#xff0c;30分&#xff0c;1题1分&#xff09;Part2/3. 词语|语法&#xff0c;完型填空&#xff08;20分钟&#xff0c;25分&a…

《程序员面试金典(第6版)》面试题 16.07. 最大数值(移位 + 整形提升)

题目描述 编写一个方法&#xff0c;找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。 示例&#xff1a; 输入&#xff1a; a 1, b 2输出&#xff1a; 2 解题思路与代码 我真的觉得这道题很智障&#xff0c;但是你先别急。 这道题目的意义在于让你使用一…

老男孩读 pcie

之一1 2 RC的内部实现很复杂,PCIe Spec也没有规定RC该做什么,还是不该做什么。我们也不需要知道那么多,只需清楚:它一般实现了一条内部PCIe总线(BUS 0),以及通过若干个PCIe bridge,扩展出一些PCIe Port,如下图所示: PCIe Endpoint,就是PCIe终端设备,比如PCIe SSD…

Selenium:WebDriver简介及元素定位

目录 一、WebDriver原理 二、WebDriver定位方法 三、WebElement接口常用方法 一、WebDriver原理 1、关于WebDriver 设计模式&#xff1a;按照Server-Client的经典设计模式设计&#xff1b; Server端&#xff1a;即Remote Server&#xff08;远程服务器&#xff09;&#x…

@Autowired与@Resource原理知识点详解

文章目录 前言springIOC依赖注入的三种方式属性注入&#xff08;字段注入&#xff09;构造方法注入setter注入用哪个&#xff1f; Autowired实现原理 Resource实现原理结论 Autowired与Resource的不同来源不同参数不同使用不同装配顺序 前言 现在spring可以说是一统天下了&…

idea自带database连接mysql失败问题

idea2023.1版连接mysql失败 DBMS: MySQL (ver. 5.7.13) Case sensitivity: plainexact, delimitedexact Driver: MySQL Connector Java (ver. mysql-connector-java-5.1.47 ( Revision: fe1903b1ecb4a96a917f7ed3190d80c049b1de29 ), JDBC4.0) [08S01]Communications link fai…

【Python】漏斗模型--生成漏斗案例 Demo实例

文章目录 背景一、漏斗模型二、漏斗模型案例1. 电商购物流程2. AARRR模型 三、如何绘制漏斗模型&#xff1f;总结 背景 很早之前就知道漏斗模型&#xff0c;但没有做更多的了解和运用&#xff0c;后来对漏斗模型的了解稍加深入之后&#xff0c;觉得它不仅仅是一个模型&#xf…