深入理解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 类加载之前,我们复 ...
随机推荐
- 2018-12-1-WPF-修改-ItemContainerStyle-鼠标移动到未选中项效果和选中项背景
title author date CreateTime categories WPF 修改 ItemContainerStyle 鼠标移动到未选中项效果和选中项背景 lindexi 2018-12- ...
- K8S之集群搭建
转自声明 ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建 1.K8S环境搭建的几种方式 搭建K8S环境有几种常见的方式如下: (1)Minikube Minikube是一 ...
- 深度探索C++对象模型之第二章:构造函数语意学之成员初始值列表
当我们需要设置class member的初值时,要么是经过member initialization list ,要么在construcotr内. 一.先讨论必须使用member initializa ...
- C++ 系列:iostream 的用途与局限
转载自http://www.cnblogs.com/Solstice/archive/2011/07/17/2108715.html 本文主要考虑 x86 Linux 平台,不考虑跨平台的可移植性,也 ...
- C++ 系列:随机数
C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand().不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随 ...
- 挂载U盘
.fdisk -l 查看当前系统存储盘 (sdaX一般是系统自带, sdbX则是外接) .mount /dev/sdbX /mnt/usb/ (如果usb目录不存在可创建新目录) .umount /m ...
- Python 学习杂项
#print("Hello World!") #name = "nihfjkds" age = 454 num1 = 1 num2 = 2 #print(nam ...
- from urllib import parse模块的使用
一.介绍 定义了url的标准接口,实现url的各种抽取 parse模块的作用:url的解析,合并,编码,解码 二.代码 方法一:urlparse 实现url的识别和分段 from urllib imp ...
- css3 鼠标悬浮动画效果
CSS3案例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- 适AT maven多个子项目、父项目之间的引用问题
适AT maven多个子项目.父项目之间的引用问题 在项目时用到maven管理项目,在一个就项目的基础上开发新的项目:关于子项目和父项目,子项目与子项目之间的调用问题,发现自己存在不足,以下是自己 ...