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;希望对大家有帮助!局域网共享打印机连接失败的解决方…

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;这…

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

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

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;指两个以上的进程互相要求对方已经占有的资源导致无法继…

垂直梯形校正画质损失多少_梯形校正功能是怎么实现的?其中可大有学问

梯形校正这个概念&#xff0c;想必大部分投影仪用户早已耳熟能详。所谓的梯形校正&#xff0c;指的是当我们的投影仪位置摆放不正时&#xff0c;投射出来的画面会是一个梯形&#xff0c;这时候需要通过投影仪的梯形校正功能将画面调整为可以正常观看的矩形。虽然目前市场上的大…

操作系统基础:存储管理知识笔记(一)

1、存储器基础知识 存储器管理的对象是主存或内存&#xff0c;存储器是计算机系统中非常关键的资源&#xff0c;用来存放各种信息的主要场所。存 储器管理功能主要包括&#xff1a;主存空间的分配和回收、提供主存利用率、扩充主存、主存信息的保护。 2、存储器结构 存储器结构…

asp点击按钮sql列求和_助你2020晋级互联网大数据阵营(一):轻轻松松学SQL

毫不负责任的说&#xff0c;你和数据科学家最大的鸿沟&#xff0c;就差一个SQL语言&#xff1a;)入门后&#xff0c;后面的事情就简单了为了帮大家尽快入门Hive SQL、学会提数和分析&#xff0c;实现在大数据领域大干一场的愿望&#xff0c;帮你准备好了数据&#xff0c;准备好…

幂等和高并发在电商系统中的使用

在Java web项目开发中&#xff0c;经常会听到在做订单系统中生成订单的时候&#xff0c;要做幂等性控制和并发控制&#xff0c;特对此部分内容作出总结&#xff0c;在高并发场景下&#xff0c;代码层面需要实现并发控制&#xff1b;但是幂等性&#xff0c;其实更多的是系统的接…

@transactional注解失效情况

先来了解一下Transactional注解事务的特性吧&#xff0c;可以更好排查问题 1、service类标签(一般不建议在接口上)上添加Transactional&#xff0c;可以将整个类纳入spring事务管理&#xff0c;在每个业务方法执行时都会开启一个事务&#xff0c;不过这些事务采用相同的管理方…

计算机c盘隐藏了怎么办,win7怎么隐藏c盘 win7c盘被隐藏了怎么解除

很多的电脑用户担心其他用户在使用电脑时修改c盘中的重要文件&#xff0c;所以会将c盘设置为隐藏&#xff0c;那么大家知道在win7系统中怎么隐藏c盘吗?方法很简单&#xff0c;下面小编为大家带来win7隐藏c盘的详细教程&#xff0c;不知道怎么隐藏的朋友可以查看下面的教程学习…

操作系统基础:存储管理知识笔记(二)

一、分页存储管理 1、分页存储管理介绍 1.1 分页原理 页&#xff1a;将一个进程的地址空间划分为若干个大小相等的区域称为页。 块、页框&#xff1a;主存空间划分成与页相同的若干个物理块。 1.2 地址结构 分页系统地址结构&#xff1a;前一部分为页号&#xff1b;后一部分为页…