深入理解JVM(一)类加载器部分:双亲委派模型
类加载器的父亲委托机制
- 在父亲委托机制中,各个类加载器按照父子关系形成了树形结构,除了根类加载器之外,其余的类加载器都有且只有一个父加载器。
先让最顶层可以加在的父加载器加栽(所有可加载的加载器中,处于最顶层的那一个加载器加载,如果都不能加载,则失败)
- Bootstrap ClassLoader 启动类加载器
$JAVA_HOME中jre/lib/rt.jar里所有的class,由c++实现,不是ClassLoader的子类
- Extension ClassLoader 扩展类加载器
负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中的jre/lib/*.jar或者-Djava.ext.dirs指定目录下的jar包
- App ClassLoader 系统类加载器
负责加载classpath中指定的jar包及其目录中的class
成功加载类的加载器叫做定义类加载器
所有能够成功返回Clas对象引用的类加载器叫做初始类加载器(包括定义累加载器)
eg1:
public class MyTest7 {
public static void main(String[] args)throws Exception {
Class<?> clazz=Class.forName("java.lang.String");
System.out.println(clazz.getClassLoader());
Class<?> clazzc=Class.forName("com.aaa.test.c");
System.out.println(clazzc.getClassLoader());
}
}
class c{
}
//输出结果:
null
sun.misc.Launcher$AppClassLoader@18b4aac2
不同类加载器作用和加载器动作分析
- 获取一个类的父加载器
public class MyTest13 {
public static void main(String[] args) {
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
System.out.println(classLoader);
while(classLoader!=null){
classLoader=classLoader.getParent();
System.out.println(classLoader);
}
}
}
//输出结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@512ddf17
null
- 获取资源路径
/**
* @author lillcol
* 2019/5/22-17:09
*/
public class MyTEST14 {
public static void main(String[] args) throws IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
System.out.println(classLoader);
String resourceName = "com/aaa/test/MyTest13.class";
Enumeration<URL> urls = classLoader.getResources(resourceName);
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
System.out.println(url);
}
}
}
//输出结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
file:/E:/IdeaProjects/AAAE2E2/target/scala-2.11/classes/com/aaa/test/MyTest13.class
- 几种加载器的获取方法
/**
* @author lillcol
* 2019/5/22-17:09
*/
public class MyTEST14 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Class<?> clazz=Class.forName("com.aaa.test.MyTEST14");
ClassLoader classLoader1 = clazz.getClassLoader(); //获得当前类的ClassLoader
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); //获得当前线程上下文的ClassLoader
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); //获得系统的ClassLoader
System.out.println(classLoader1);
System.out.println(contextClassLoader);
System.out.println(systemClassLoader);
}
}
//输出结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$AppClassLoader@18b4aac2
用户自定义的类、启动类由AppClassLoader加载
String类由根类加载器加载
/**
* @author lillcol
* 2019/5/22-17:09
*/
public class MyTEST14 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Class<?> clazz=MyTEST14.class;
System.out.println(clazz.getClassLoader());
System.out.println("----------");
Class<?> clazz1=String.class;
System.out.println(clazz1.getClassLoader());
}
}
//输出结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
----------
null
本文为学习张龙老师深入理解JVM的笔记与心得,转载请注明出处!!!
深入理解JVM(一)类加载器部分:双亲委派模型的更多相关文章
- 【深入理解JVM】类加载器与双亲委派模型 (转)
出处: [深入理解JVM]类加载器与双亲委派模型 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过 ...
- 【深入理解JVM】类加载器与双亲委派模型
原文链接:http://blog.csdn.net/u011080472/article/details/51332866,http://www.cnblogs.com/lanxuezaipiao/p ...
- 【深入理解JVM】:类加载器与双亲委派模型
类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...
- 深入理解JVM(③)虚拟机的类加载器(双亲委派模型)
前言 先解释一下什么是类加载器,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为"类加载器(Class Loader)". 类与类加载器 类加载 ...
- 类文件的结构、JVM 的类加载过程、类加载机制、类加载器、双亲委派模型
一.类文件的结构 我们都知道,各种不同平台的虚拟机,都支持 "字节码 Byte Code" 这种程序存储格式,这构成了 Java 平台无关性的基石.甚至现在平台无关性也开始演变出 ...
- 深入理解java虚拟机(九)类加载器以及双亲委派模型
虚拟机把类加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类加载器”. 类与类加载器 任 ...
- JVM类加载器以及双亲委派模型
从java开发人员的角度来看,类加载器可以分为3种: 1.启动类加载器(Bootstrap ClassLoader),负责将存放在<JAVA_HOME>\lib目录中,或者被-Xbootc ...
- Java自定义类加载器与双亲委派模型
其实,双亲委派模型并不复杂.自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后copy一下就能用.但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制,这样显然不行.可是自定义类 ...
- JVM的类加载过程以及双亲委派模型详解
JVM的类加载过程以及双亲委派模型详解 这篇文章主要介绍了JVM的类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象 ...
- Tomcat 类加载器打破双亲委派模型
我们分为4个部分来探讨: 1. 什么是类加载机制? 2. 什么是双亲委任模型? 3. 如何破坏双亲委任模型? 4. Tomcat 的类加载器是怎么设计的? 我想,在研究tomcat 类加载之前,我们复 ...
随机推荐
- 13-MySQL-Ubuntu-数据表的查询-条件查询(二)
条件查询 1,比较查询(>,<,>=,<=,=)注:SQL查询语句的等于号(=) (1)查询学生表中年龄大于18岁的学生姓名和性别信息 select name,gender f ...
- 【转】WebResource实现在自定义控件中内嵌JS文件
在类库中的资源 其他项目中要使用 需要嵌入才行 参考文献:WebResource实现在自定义控件中内嵌JS文件 1. WebResource简介 ASP.NET(1.0/1.1)给我们提供了一个开发 ...
- Ubuntu18.04安装RTX2080Ti+NVIDIA驱动+CUDA
Ubuntu18.04安装RTX 2080Ti 与 Cuda10 ==========血泪更新========= 如果可以使用ppa安装最方便了 具体参考:https://www.cnblogs.co ...
- @Formula
@Formula 计算临时属性. 相当于可以关联查询字段,然后放在实体中当做属性使用. 任务:在User实体层,增加一个额外的属性,来获取Test表中的name字段. 1 表结构 User表 Tes ...
- The linux command之环境
一.环境 shell在环境中存储了两种数据类型:环境变量(environment variables )shell变量(shell variables).在shell中这两种变量基本没有什么不同. 此 ...
- php 图片旋转和png透明
因需要先处理生成的二维码图片旋转,再和另外一张png图片合并,图片都是png <?php // this file writes the image into the http response ...
- centos 下载并安装nodejs
安装方法1——直接部署 1.首先安装wget ,这个一般都有自带有的,可能已经在系统里安装好了的. yum install -y wget 如果已经安装了可以跳过该步 2.下载nodejs最新的tar ...
- 【JZOJ6375】华灵[蝶妄想]
description analysis 明显括号序长度是偶数,如果其中一个是奇数,那么只能让这奇数行或列是括号序 对于两个都是偶数,需要分类讨论,假设\(n<m\) 有一种是牺牲掉\(n\ov ...
- C++和JavaScript脚本的相互调用
脚本调用C++相对比较容易,使用ATL组件只需要抛双接口即可,但在exe里如何做到呢?本文实现了在exe里脚本和C++的相互调用.在EXE里也需要对外抛送一个继承自IDispatch的接口.并需要重载 ...
- js 自适应容器宽高
var echartsWarp= document.getElementById('echartsWarp'); var resizeWorldMapContainer = function () { ...