java八股文面试[JVM]——双亲委派模型



1.当AppClassLoader去加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委托给父加载器ExtClassLoader去完成。
2.当ExtClassLoader去加载一个class时,它首先也不会去尝试加载这个类,而是把类加载请求委托给父加载器BootstrapClassLoader去完成。
3.如果BootstrapClass加载失败(例如在JAVA_HOME/jre/lib里未找到该class),就会使用ExtClassLoader来尝试加载。
4.如果使用ExtClassLoader加载失败(例如在JAVA_HOME/jre/lib/ext里未找到该class),就会使用AppClassLoader来尝试加载。如果AppClassLoader也加载失败,则会抛出异常ClassNotFoundException。
从代码层面了解几个Java中定义的类加载器及双亲委派模型的实现,他们的类图关系如下。

从图可以看出顶层的类加载器是抽象类abstract ClassLoader,其后所有的类加载器都继承自ClassLoader(不包括启动类加载器)。为了更好的理解双亲委派模型,ClassLoader源码中的loadClass(String)方法该方法加载指定名称(包括包名)的二进制类型,该方法在jdk1.2后不建议用户重写但是可以直接调用该方法。loadClass()方法是ClassLoader类自己实现的,该方法中的逻辑就是双亲委派模式的实现。loadClass(String name, boolean resolve)是一个重载方法,resolve参数代表是否生成Class对象的进行解析相关的操作,源码分析如下。
双亲委派模型意义总结来讲就是:
1.系统类防止内存中出现多份相同的字节码。
2.保证Java程序安全稳定运行。
加载类的三种方式
到这里,相信大家都对类加载器和类的加载都有一定的了解了,那么你知道嘛?常见的加载类的方式有三种。
- 静态加载:也就是使用
new关键字来创建实例对象, - 动态加载:使用
Class.forName()动态加载(反射加载类型),然后调用类的newInstance()方法实例化对象。 - 动态加载:通过类加载器的
loadClass()方法来加载类,然后调用类的newInstance()方法实例化对象。
三种方式的区别
- 第一种和第二种方式使用的类加载器是相同的,都是当前类加载器(this.getClass().getClassLoader()),第三种方式需要用户指定类加载器。
- 如果需要在当前类路径以外加载类,则只能使用第三种方式,
第三种方式加载的类与当前类分属不同的命名空间。 - 第一种方式是静态加载,第二种和第三种是动态加载。
两种异常(Exception)
- 静态加载的时候如果在运行环境中找不到要初始化的类,抛出的是
NoClassDefFoundError。它在Java的异常体系中是一个error。 - 动态加载的时候如果运行环境中找不到要初始化的类,抛出的是
ClassNotFoundException。它在Java的异常体系中是一个checked异常。
Class.forName与ClassLoader.loadClass的区别
首先,我们必须要明白类加载机制的三个主要过程是:加载–>连接–>初始化。
Class.forName():除了将类的.class文件加载到JVM中之外,还对类进行解释,执行类中的static块。- ClassLoder.loadClass():只是将类的.class文件加载到JVM中,并不会执行类的static块,只有在newInstance时才会执行static块。
Class.forName(name, initialize, loader):带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数。创建类的对象 。
下面我们写下代码,加深一下影响。
public class Demo {static {System.out.println("正在加载Demo...");}
}
import java.lang.Class;public class TestDemo {public static void main(String[] args) throws ClassNotFoundException {//1.使用 Class.forName()加载类,默认执行static块。Class.forName("Demo");//获得当前类的类加载器ClassLoader classLoader = Test.class.getClassLoader();//2.使用 Class.forName()加载类,并指定ClassLoader。初始化时不会执行static块。Class.forName("Demo", false, classLoader);//3.使用ClassLoader类的loadClass()方法加载类,不会执行初始化classLoader.loadClass("Demo");}
}
只有第一行代码输出了

知识来源:
【基础】双亲委派模型_哔哩哔哩_bilibili
深入理解Java类加载器(ClassLoader)
相关文章:
java八股文面试[JVM]——双亲委派模型
1.当AppClassLoader去加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委托给父加载器ExtClassLoader去完成。 2.当ExtClassLoader去加载一个class时,它首先也不会去尝试加载这个类,而是把类加载请求委托给父加载…...
NLP与大模型主题全国师资培训班落地,飞桨持续赋能AI人才培养
为了推动大模型及人工智能相关专业人员的培养,8月11日-8月13日,由中国计算机学会主办、机械工业出版社、北京航空航天大学、百度飞桨联合承办 “CCF群星计划之文心高校行- NLP与大模型”主题师资培训班(以下简称培训班)在北京天信…...
Jupyter Notebook 配置根目录
注:本文是在 Windows 10 上配置 Jupyter Notebook 打开的默认根目录,Linux 同。 步骤一:创建 Jupyter Notebook 配置文件 使用以下命令创建 Jupyter Notebook 配置文件(如果尚未创建): jupyter notebook …...
算法 位运算
文章目录 一、&(按位与)运算符二、|(按位或)运算符三、^(异或)运算符四、~(取反)运算符五、<<(左移)运算符六、>>(右移ÿ…...
Linux 虚拟机常用命令
一、文件/文件夹管理 1. ls命令 就是 list 的缩写,通过 ls 命令不仅可以查看 linux 文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。 ls -a 列出目录所有文件,包含以.开始的隐藏文件ls -A 列出除.…...
解决抖音semi-ui的Input无法获取到onChange事件
最近在使用semi-ui框架的Input实现一个上传文件功能时遇到了坑,就是无法获取到onChange事件,通过console查看只是拿到了一个文件名。但若是把<Input>换成原生的<input>,就可以正常获取到事件。仔细看了下官方文档,发现…...
免费的png打包plist工具CppTextu,一款把若干资源图片拼接为一张大图的免费工具
经常做游戏打包贴图的都知道,要把图片打包为一张或多张大图,要使用打包工具TexturePacker。 TexturePacker官方版可以直接导入PSD、SWF、PNG、BMP等常见的图片格式,主要用于网页、游戏和动画的制作,它可以将多个小图片汇聚成一个…...
深层次分析字符数组和字符串的区别是什么?
前言 (1)休闲时刻刷B站,看到一个卖课的,发视频问,char arr1[]{‘H’,‘E’,‘L’,‘L’,‘O’};和char arr2[]“HELLO”;区别是什么。 (2)看那个卖课博主一顿分析,最后成功得出&…...
Redis 的主从复制、哨兵模式、集群脑裂
主从复制 主从复制是 Redis 高可用服务最基础的保证,将一台 Redis 主服务器,同步数据到多台 Redis 从服务器上,即一主多从的模式,且主从服务器之间采用的是「读写分离」的方式。 主服务器可以进行读写操作,当发生写操…...
Pycharm通过SSH配置centos上Spark环境
直接在shell进行pyspark进行编程,程序没有办法写得太长,而且我们希望能够实现一个及时给出结果的编程环境,可以使用pycharm连接centos上的spark,进行本地编程,同步到centos系统中运行程序,并把结果返回pych…...
leetcode做题笔记98. 验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 思路一:递归 …...
C# 中Lambda中的的匿名函数
/// <summary>/// 根据设备号,获取故障列表/// </summary>/// <param name"scanCode">主键</param>/// <returns></returns>[HttpGet]public async Task<IActionResult> GetItemPageList(string scanCode){//v…...
铰接式车辆的横向动力学仿真提供车辆模型研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Ubuntu20 安装 libreoffice
1 更新apt-get sudo apt-get update2 安装jdk 查看jdk安装情况 Command java not found, but can be installed with:sudo apt install default-jre # version 2:1.11-72, or sudo apt install openjdk-11-jre-headless # version 11.0.138-0ubuntu1~20.04 sud…...
HTTP协议(JavaEE初阶系列15)
目录 前言: 1.HTTP协议 1.1HTTP协议是什么 1.2HTTP协议的报文格式 1.2.1抓包工具的使用 1.2.2HTTP请求 1.2.3HTTP响应 2.HTTP请求 2.1首行的组成 2.2.1URL的组成 2.2认识“方法”(method) 2.2.1GET方法 2.2.2POST方法 2.2.3GET…...
机器学习基础10-审查回归算法(基于波士顿房价的数据集)
上一节介绍了如何审查分类算法,并介绍了六种不同的分类算法,还 用同一个数据集按照相同的方式对它们做了审查,本章将用相同的方式对回归算法进行审查。 在本节将学到: 如何审查机器学习的回归算法。如何审查四种线性分类算法。如…...
基于 CentOS 7 构建 LVS-DR 群集。配置nginx负载均衡。
1、基于 CentOS 7 构建 LVS-DR 群集。 [root132 ~]# nmcli c show NAME UUID TYPE DEVICE ens33 c89f4a1a-d61b-4f24-a260-6232c8be18dc ethernet ens33 [root132 ~]# nmcli c m ens33 ipv4.addresses 192.168.231.200/24 [r…...
【云原生】Docker的数据管理(数据卷、容器互联)
目录 一、数据卷(容器与宿主机之间数据共享) 二、数据卷容器(容器与容器之间数据共享) 三、 容器互联(使用centos镜像) 总结 用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据…...
使用vlc在线播放rtsp视频url
1. 2. 3. 工具链接: https://download.csdn.net/download/qq_43560721/88249440...
copy is all you need前向绘图 和疑惑标记
疑惑的起因 简化前向图 GPT4解释 这段代码实现了一个神经网络模型,包含了BERT、GPT-2和MLP等模块。主要功能是给定一个文本序列和一个查询序列,预测查询序列中的起始和结束位置,使其对应文本序列中的一个短语。具体实现细节如下:…...
MySQL 8.0在麒麟系统安装后,别忘了这几步:改密码、开远程、设自启
MySQL 8.0在麒麟系统安装后的关键配置指南 当你成功在麒麟V10 SP3系统上安装了MySQL 8.0数据库后,真正的挑战才刚刚开始。许多初学者往往忽视了安装后的关键配置步骤,导致数据库安全性不足或功能受限。本文将带你深入了解如何正确完成这些关键配置&…...
pose-search:5分钟搭建你的人体姿态搜索系统
pose-search:5分钟搭建你的人体姿态搜索系统 【免费下载链接】pose-search x6ud.github.io/pose-search 项目地址: https://gitcode.com/gh_mirrors/po/pose-search 在人工智能技术飞速发展的今天,人体姿态搜索已成为计算机视觉领域的重要突破。p…...
KART-RERANK与MySQL集成:构建企业级智能搜索系统
KART-RERANK与MySQL集成:构建企业级智能搜索系统 你是不是也遇到过这样的问题?自家电商平台或者内容社区里,用户搜“适合夏天穿的轻薄外套”,结果系统返回一堆“冬季加厚羽绒服”或者“春秋季夹克”。用户抱怨搜不准,…...
LivePortrait完整部署指南:快速上手高效人像动画生成
LivePortrait完整部署指南:快速上手高效人像动画生成 【免费下载链接】LivePortrait Bring portraits to life! 项目地址: https://gitcode.com/GitHub_Trending/li/LivePortrait LivePortrait是一款开源的AI驱动人像动画工具,能够将静态肖像照片…...
(仿真原件+报告)下垂控制-基于T型三电平逆变器的下垂控制,电压电流双闭环,采用LCL滤波,S...
(仿真原件报告)下垂控制-基于T型三电平逆变器的下垂控制,电压电流双闭环,采用LCL滤波,SPWM调制方式 1.提供simulink仿真源文件 2.提供下垂控制原理与下垂系数计算方法 3.中点平衡控制,电压电流双闭环控制 4…...
3步解锁全网资源:res-downloader实战手册
3步解锁全网资源:res-downloader实战手册 【免费下载链接】res-downloader 资源下载器、网络资源嗅探,支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gitcode.com/GitHub_Tren…...
AutoGen Studio实战分享:用Qwen3-4B模型实现自动化任务处理
AutoGen Studio实战分享:用Qwen3-4B模型实现自动化任务处理 1. AutoGen Studio简介与核心价值 AutoGen Studio是一个低代码界面,专为快速构建AI代理而设计。它基于AutoGen AgentChat构建,提供了高级API用于创建多代理应用。这个工具的核心价…...
Source Han Serif CN完全攻略:企业级中文字体的零成本解决方案
Source Han Serif CN完全攻略:企业级中文字体的零成本解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字设计与开发领域,中文字体的选择一直是平衡…...
Mac视频预览增强工具:解决MKV文件无法预览问题的全方位方案
Mac视频预览增强工具:解决MKV文件无法预览问题的全方位方案 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://g…...
告别AD7606!用ZYNQ的PL+PS协同处理搞定24位8通道同步ADC采集(基于AXI总线与HLS)
ZYNQ平台下的高精度多通道同步采集系统设计实战 在工业测量、医疗设备和科研仪器等领域,对多通道高精度同步数据采集的需求日益增长。传统方案如AD7606虽然成熟稳定,但在24位分辨率、8通道同步采集等高性能场景下已显力不从心。本文将分享如何基于ZYNQ S…...
