持续更新JVM相关知识,敬请关注:

Java虚拟机精髓专栏​zhuanlan.zhihu.com

上一节说了下类加载器和类加载过程。这一节我们看下几种不同的类加载器。

JVM支持的类加载器有两类,分别是引导类加载器和自定义加载器。这里的自定义自定义加载器,不仅仅指用户自己实现的加载器,而是泛指所有继承ClassLoader这个抽象类的加载器。

作为JAVA程序员,起码要知道引导加载器、扩展加载器、系统加载器这三种,除此之外,还有很多用户自定义加载器,他们的分类关系见下图。

JAVA内部实际的继承关系如何呢?大家可以查看下Laucher类,会发现其中有两个内部类,ExtClassLoader和AppClassLoader,这两个就是扩展类加载器和系统类加载器。他们都继承自URLClassLoader,URLClassLoader再继承自SecureClassLoader,最终继承ClassLoader。下面我们来看一个代码实例:

首先我们通过ClassLoader提供的方法直接获取系统类加载器,会发现是AppClassLoader,然后我们再通过getParent方法,获取上层扩展类加载器,发现是ExtClassLoader,之后我们再想getParent获取引导类加载器,发现获取不到了,输出了null。

下面我们通过当前类的类对象,获取他的ClassLoader,输出的是AppClassLoader,说明当前类是由系统类加载器加载的,并且大家注意,这个系统类加载器同之前那个内存地址是一致的,有此可见,这个系统类加载器只会被加载一次。

最后我们再看下String类的加载器,发现输出的是null,这就说明了,String加载器是通过引导类加载器加载的。系统的核心类库,都是使用引导类加载的。

下面我们来具体说下这几种不同的加载器:

1、引导类加载器(Bootstrap ClassLoader)

引导类加载器是由C和C++语言实现的,集成在JVM内部,所有JAVA的核心类库(rt.jar、resources.jar、sun.boot.class.path等)通过它来加载的。引导类加载器不继承java.lang.ClassLoader也没有上层加载器。他是扩展类加载器和应用类加载器的父类。Java由于安全方面的考虑,引导类加载器,只能加载java、javax、sun为开头的java自身的类库。

我们通过代码虽然获取不到引导类加载器,但是我们可以查看下可以加载哪些类库:

import 

可以看到输出结果如下:

/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/resources.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/rt.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/sunrsasign.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/jsse.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/jce.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/charsets.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/jfr.jar
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/classes

2、扩展类加载器(Extension ClassLoader)

扩展类加载器,是JVM内部自带的加载器,Java语言编写,对应sun.misc.Launcher$ExtClassLoader这个内部类。间接继承自ClassLoader类,他是通过引导类加载器进行加载的。扩展类加载器负责加载java.ext.dirs所指定目录或jre/libb/ext中的类库,我们自己定义的jar放到这些路径下,就会被扩展类加载器所加载。

3、系统类加载器(System ClassLoader)

系统类加载器,也叫做应用程序加载器,也是由JAVA语言编写的,对应sun.misc.Launcher$AppClassLoader这个内部类。同样间接继承ClassLoader类,它是通过扩展类加载器加载的。系统类加载器负责加载classpath路径下或java.class.path属性下的指定的了类库。实际上,系统类加载器是程序中的默认加载器,我们平常所编写的绝大不部分类,默认都是由这个加载器所加载的。这个可以看上面的代码演示结果。代码中,我们可以通过ClassLoader提供的getSystemClassLoader()方法获得到这个类加载器的实例。

4、用户自定义类加载器(User Defined ClassLoader)

在某些场合下,我们使用上述三种类加载器,无法满足我们的使用需求,这是就需要由我们自己去自定义一些类加载器,当然,这个在一般应用场景下会比较少用,所以在这不做过多讲解,之后再去详细说。用户可以通过继承ClassLoader,jdk1.2以后,可以重写findClass方法来实现自定义,这里主要编写的逻辑是加载对应路径的类的二进制数组,然后调用defineClass()方法去生成传入字节数组所代表类的实例。这里面对二进制数组的特殊操作,就可以根据需求去做更改了。如果需求更加简洁,也可以直接继承URLClassLoader来实现。

未能成功加载扩展程序_【JAVA虚拟机(JVM)精髓】09-几种不同的类加载器相关推荐

  1. 未能成功加载扩展程序

    将Switchy1.crx改为Switchy1.rar 解压缩Switchy1.rar 得到Switchy1 将Switchy1加载至goole

  2. win7 exfat补丁_win7电脑玩斗仙游戏提示主动防御系统未能成功加载如何解决-系统城...

    斗仙游戏是很多win7系统玩家喜欢的一款大型多人网络游戏,可是近日有用户在游戏中加载"主动防御系统",然后启动的时候提示主动防御系统未能成功加载,为了您的账号安全,游戏将自动退出, ...

  3. 如何解除Chrome无法安装第三方插件的限制(无法从该网站加载扩展程序和用户脚本)

    2018年6月谷歌宣布将废除 Chrome 扩展的内联安装方式(inline installation).所以说,自Chrome 67版本开始,谷歌调整Chrome的插件安装策略,只允许用户在应用商店 ...

  4. 解决谷歌无法加载扩展程序

    方法一 1.先将下载的文件.crx格式修改为.zip 2.然后解压zip格式文件. 3.选择加载解压过的zip文件.即可 方法二 1.在Google Chrome浏览器的桌面快捷方式上鼠标右键,选择属 ...

  5. 学习笔记:Java虚拟机——JVM内存结构、垃圾回收、类加载与字节码技术

    学习视频来源:https://www.bilibili.com/video/BV1yE411Z7AP Java类加载机制与ClassLoader详解推荐文章:https://yichun.blog.c ...

  6. Java虚拟机JVM常用的几种回收算法和垃圾回收器

    1. 垃圾回收算法 1.1 "标记-清除"算法 对内存对象进行可达性分析并标记,标记完成后统一回收.书中说有两个不足:①标记和清除效率不高:②内存空间是大量不连续的内存碎片.标记是 ...

  7. Java虚拟机jvm和Java内存模型jmm浅尝

    1. 需要了解的知识 1. 并发编程需要处理两个关键问题 线程同步和通信 2. 线程通信机制有两种 共享内存(隐式)和消息传递(显示) 3. Java中是采用共享内存模型来进行通信 2. 了解Java ...

  8. java简单通讯录的实现02person类_Java自定义类加载器实现不同版本的类加载

    一 什么是类隔离技术 只要你 Java 代码写的足够多,就一定会出现这种情况:系统新引入了一个中间件的 jar 包,编译的时候一切正常,一运行就报错:java.lang.NoSuchMethodErr ...

  9. 深入理解Java虚拟机(第二版) 第九章:类加载及执行子系统的案例与实战

    第九章 类加载及执行子系统的案例与实战 9.1 概述 9.2 Tomcat: 正统的类加载器架构 9.3 OSGi:灵活的类加载器架构 9.4 字节码生成技术与动态代理的实现 9.5 Retrotra ...

最新文章

  1. 自定义ArcGIS JavaScript 工具条样式
  2. android 怎么初始化下拉框_第30讲:“二师兄”的成长历程之二,类属性的初始化...
  3. c语言程序设计教程赵乘,《C语言程序设计教程》例题源码.pdf
  4. csv去重 python_python去重函数是什么
  5. C# 计算一点绕另一点旋转一定角度后新点的坐标
  6. Storm 多语言支持
  7. Alienbrain-数字资源在团队三维动画制作行业中的应用
  8. 【存储】AIX存储管理基本概念和操作(LVM)
  9. 苹果cmsV10二开视频+图片+小说网站源码
  10. UniApp设置APP图标配置,不自动生成所有图标问题
  11. spss26没有典型相关性分析_SPSS进行典型相关分析结果总结
  12. 微信授权登录报错:pad block corrupted
  13. android页指示动画,Android动画之翻页
  14. window上vs2017 opencv图片路径问题(附3种加载路径方法)
  15. VLC模拟TS直播流
  16. HDFS ACLs访问控制权限
  17. 阿里云搭建完全分布式
  18. 盘点那些欺骗我感情的数学定理
  19. ffmpeg中文文档
  20. python练习实例一 互不相同且不重复的数字组合

热门文章

  1. 安徽科技学院计算机二级,安徽科技大学2017年3月计算机二级考试报名时间
  2. 当前超级计算机的应用方兴未艾,四川省若尔盖县高三下学期语文模拟卷(五)
  3. java 数组写法_java书写、数据类型、数组定义
  4. matlab 子图title的位置_matlab 画图基本介绍
  5. 表字段顺序有何影响_「品味保定」炸烹虾段乾隆赞 百年保定柔雅香
  6. 苹果7手机严重卡顿_苹果手机仅配备4GB运存都不会卡顿,安卓系统为何要更多内存?...
  7. Hadoop的安装与配置——搭建完全分布式集群
  8. 自定义控件---重写Listbox实现item图标变换和item点击事件
  9. 007_Web to lead
  10. 统计abacbacdadbc中的每个字母出现的次数,输出格式是:a(4)b(3)c(3)d(2)