JVM——三个ClassLoader详解

  类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java执行时系统组件,它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个ClassLoader:根装载器ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。其中,根装载器不是ClassLoader的子类,它使用C++编写,因此我们在Java中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE目录ext中的JAR类包;AppClassLoader负责装载ClassPath路径下的类包。

  • 启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在<JAVA_HOME>\lib目录中的。启动类加载器无法被Java程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给引导类加载器,那直接使用null代替即可。
  • 扩展类加载器(Extension ClassLoader):这个加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。
  • 应用程序类加载器(Application ClassLoader):这个类加载器由sun.misc.Launcher$AppClassLoader实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也称它为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义自己的类加载器,一般情况下这个就是程序中默认的类加载器。

  我们的应用程序都是由这3种类加载器互相配合进行加载的,如果有必要,还可以加入自己定义的类加载器。这些类加载器之间的关系一般为:

  上图展示的类加载器之间的这种层次关系,称为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用组合关系来复用父加载器的代码。

  类加载器的双亲委派模型详解博客链接

  这三个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是父类装载器。默认情况下,使用AppClassLoader装载应用程序的类,用以下代码证明:

 1 /**
 2  * @author zhengbinMac
 3  */
 4 public class ClassLoaderTest {
 5 
 6     public static void main(String[] args) {
 7         ClassLoader loader = Thread.currentThread().getContextClassLoader();
 8         System.out.println("current loader:" + loader);
 9         System.out.println("parent loader:" + loader.getParent());
10         System.out.println("grandparent loader:" + loader.getParent().getParent());
11     }
12     /*
13      * output:
14      *    current loader:sun.misc.Launcher$AppClassLoader@1b6d3586
15      *    parent loader:sun.misc.Launcher$ExtClassLoader@1540e19d 
16      *    grandparent loader:null // 因为根类装载器在Java中访问不到,所有返回null
17      */
18 }

  Thread.currentThread():返回对当前正在执行的线程对象的引用。

  getContextClassLoader():返回该线程的上下文 ClassLoader。

  通过以上的输出信息,可以明白,ClassLoader是AppClassLoader,父ClassLoader是ExtClassLoader,祖父ClassLoader是根类装载器,因为在Java中无法获得它的句柄,所以直接返回null。

  除了JVM默认的三个ClassLoader以外,可以编写自己的第三方类装载器,以实现一些特殊的需求。类文件被装载并解析后,在JVM内将拥有一个对应的java.lang.Class类描述对象,该类的实例都拥有指向这个类描述对象的引用,而类描述对象又拥有指向关联ClassLoader的引用。如下图所示:

ClassLoader重要方法


  在Java中,ClassLoader是一个抽象类,位于java.lang包中。下面对该类的一些重要接口方法进行介绍:

  • Class loadClass(String name)

  name参数指定类装载器需要装载类的名字,必须使用全限定类名,如com.zhengbin.entity.Student。该方法有一个重载方法loadClass(String name, boolean resolve),resolve参数告诉类装载器是否需要解析该类。在初始化类之前,应考虑进行类解析的工作,但并不是所有的类都需要解析,如果JVM只需要知道该类是否存在或找出该类的超类,那么就不需要进行解析。

  • Class defineClass(String name, byte[] b, int off, int len)

  将类文件的字节数组转换成JVM内部的java.lang.Class对象。字节数组可以从本地文件系统、远程网络获取。name为字节数组对应的全限定类名。

  • Class findSystemClass(String name)

  从本地文件系统载入Class文件,如果本地文件系统不存在该Class文件,将抛出ClassNotFoundException异常。该方法是JVM默认使用的装载机制。

  • ClassLoader getParent()

  获取类装载器的父装载器,除根装载器外,所有的类装载器都有且仅有一个父装载器,ExtClassLoader的父装载器是根装载器,因为根装载器非Java编写,所以无法获得,将返回null。

转载于:https://www.cnblogs.com/zhengbin/p/5631987.html

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

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

相关文章

c++头文件_51单片机C语言编程知多少:几人不知头文件,你要的干货在这里了

近期写了一些比较大的单片机程序&#xff0c;找了很多参考资料&#xff0c;看了大量别人的程序。我从中发现了自己对于C语言编程还只是知道如何实现功能&#xff0c;但对编程规范掌握的不好&#xff0c;编程习惯也没有很好的养成。学了这么久的单片机&#xff0c;还真是挺难为情…

最常问的MySQL面试题集合

除了基础题部分&#xff0c;本文还收集整理的MySQL面试题还包括如下知识点或题型&#xff1a;MySQL高性能索引SQL语句MySQL查询优化MySQL高扩展高可用MySQL安全性问题1&#xff1a;char、varchar的区别是什么&#xff1f;varchar是变长而char的长度是固定的。如果你的内容是固定…

计算机打印机共享失败,局域网共享打印机连接失败怎么办

在局域网中由于办公需要&#xff0c;经常要连接网络打印机&#xff0c;但是有时候就无法连接&#xff0c;提示各种连接失败&#xff0c;下面是学习啦小编给大家整理的一些有关局域网共享打印机连接失败的解决方法&#xff0c;希望对大家有帮助!局域网共享打印机连接失败的解决方…

高斯模糊java代码_OpenCV3 Java图形图像上的高斯模糊(Imgproc.GaussianBlur)

代码案例&#xff1a;package com.what21.opencv.demo;import org.opencv.core.Core;import org.opencv.core.Mat;import org.opencv.core.Size;import org.opencv.imgcodecs.Imgcodecs;import org.opencv.imgproc.Imgproc;public class GaussianBlur {public static void main…

实时数据集成

企业应用集成 面向服务的体系结构 (SOA) 目前应该是一个很受欢迎的名词&#xff0c;中间件技术人员几乎到了言必称SOA的程度&#xff0c;数据集成当然也不例外&#xff0c;在Oracle openworld2008大会上&#xff0c;就推出了一堆数据集成的专场演讲&#xff0c;其中和SOA结合最…

idea 中代码大小写切换快捷键

idea用使用 CTRL SHIFT U 使用前&#xff1a; 使用后&#xff1a;

nginx做服务器入口_Nginx实现http反向代理

什么是反向代理&#xff1f;反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;并将从服务器上得到的结果返回给internet上请求连接的客户端&#xff0c;此时代理服务器…

操作系统基础:进程知识笔记(二)

一、管程 1、管道概念概念 管道是用于连接一个读进程和一个写进程。用来实现它们之间通信的共享文件。 2、管程的概念 管程是由一些共享数据、一组能为并发进程所执行的作用在共享数据上的操作集合、初始代码、以及存取权组成。管程提供了一种可以允许多线程安全、有效地共享抽…

怎样保护计算机连接线,一根网线把电脑烧了:雷雨天如何保护家电?

记得在小时候&#xff0c;每逢遇到雷雨天气&#xff0c;爸妈总会让我们关掉电视机、电脑等家电&#xff0c;虽然很不情愿&#xff0c;但为了避免电器遭受雷击造成损坏&#xff0c;我们还是会照做。现在长大了&#xff0c;除了知其然&#xff0c;还更要知其所以然&#xff0c;那…

HDU5697 刷题计划 dp+最小乘积生成树

分析&#xff1a;就是不断递归寻找靠近边界的最优解 学习博客&#xff08;必须先看这个&#xff09;&#xff1a; 1&#xff1a;http://www.cnblogs.com/autsky-jadek/p/3959446.html 2&#xff1a;http://blog.csdn.net/u013849646/article/details/51524748 注&#xff1a;这…

pos加盟申请php_ThinkPHP万能表单程序源码 报名预约加盟申请调查表单程序源码

平台声明&#xff1a;本商品由平台商家发布&#xff0c;如果本商品源码侵犯了您的利益请在上方价格右侧或联系平台客服举报。微信表单-实现各行业的报名、预约、加盟申请、问卷调查等应用01.自定义表单模型(自定义字段支持字符串、数字、单选、多选、下拉、日历、时间、邮件、省…

分析Java中的三种不同变量的区别

1、首先分析Java中的三种不同变量的区别&#xff0c;如下表所示 概念默认值其他类变量 也叫静态变量&#xff0c;是类中独立于方法之外的变量 用static 修饰 有默认初始值&#xff0c;系统自动初始化。 如boolean默认为false. 可以被public&#xff0c;protect&#xff0c;pr…

分享我常用的5个免费的在线 SQL 数据库环境,简直太方便了!

大今天给大家分享几个在线的免费 SQL 运行环境&#xff0c;也就是在线数据库。这些网站可以帮助我们快速运行一些 SQL 语句的测试或者验证&#xff0c;同时还可以在网络上进行分享&#xff0c;关键不需要自己安装数据库。SQL FiddleSQL Fiddle 提供了 MySQL、Oracle、PostgreSQ…

python刷题用leet_GitHub - Yolymaker/leetcode-python: 利用python分类刷leetcode题目

leetcode分类高效刷题 leetcode是一个很好的学习算法的一个online judge的网站&#xff0c;通过刷题能够快速提升自己的算法能力。但是令大家都头疼的就是&#xff0c;怎么能够高效的通过leetcode刷题掌握算法的做题技巧&#xff0c;并且顺利通过面试。 刷题的时候千万不要怀疑…

36岁 计算机博士,36岁考博士

博士生在学习期间&#xff0c;须在国内外核心期刊上正式发表与学位论文紧密相关(构成学位论文的主要组成部分)的学术论文且积分必须在6分(含6分)以上方可申请授予学位。以上发表的论文应以**大学商学院为第一署名单位&#xff0c;博士生为第一作者或导师为第一作者、博士生为第…

OPTIMIZE TABLE

INNODB 不支持mysql> OPTIMIZE TABLE t; ----------------------------------------------------------------------------------------------- | Table | Op | Msg_type | Msg_text | ------------------…

r语言 面板数据回归_R语言_018回归

回归分析是统计学的核心。它其实是一个广义的概念&#xff0c;指那些用一个或多个预测变量来预测响应变量的方法。通常&#xff0c;回归分析可以用来挑选与响应变量相关的解释变量&#xff0c;可以描述两者的关系&#xff0c;也可以生成一个等式&#xff0c;通过解释变量来预测…

Integer对象范围(-128-127)之间(Integer. valueOf()方法)

1.Integer. valueOf()方法的作用 Integer. valueOf()可以将基本类型int转换为包装类型Integer&#xff0c;或者将String转换成Integer&#xff0c;String如果为Null或“”都会报错 看下面代码示例 取值为127时 取值为128时 为什么会是这样呢&#xff1f; 首先&#xff0c;我们…

操作系统基础:进程知识笔记(三)

1、死锁概念知识 计算机中存在许多互斥资源&#xff08;打印机&#xff09;、软件资源&#xff08;进程表、临界区&#xff09;如果两个进程同时调用打印机&#xff0c;或同时进入临界区必然会出现问题。 死锁&#xff1a;指两个以上的进程互相要求对方已经占有的资源导致无法继…