JVM(二)---双亲委派机制

在这里插入图片描述

上一篇:JVM(一)—基础概念

  常说的双亲委派机制实际上是类加载器(Class Cloader)的一种加载机制。

1.什么是类加载器?

  我们在进行java程序开发的时候,.java文件会经过javac命令编译为.class字节码文件,而类加载器的职责就是动态的加载这些.class文件到JVM内存空间中,类通常是在第一次使用它的时候进行加载,也就是说,如果没有使用过该类,则该类不会被加载到JVM中。

2.加载器有哪些?在这里插入图片描述

1.BootStrap Loader

  引导类加载器是用本地代码实现的类加载器,它负责将<JAVA_HOME>/lib下面的核心类库 或 -Xbootclasspath选项指定的jar包等虚拟机识别的类库加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

2.ExtClass Loader

  扩展类加载器负责将 <JAVA_HOME >/lib/ext或者由系统变量-Djava.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。

3.Application Loader

  应用程序类加载器(系统类加载器)负责将用户类路径(java -classpath或-Djava.class.path变量所指的目录,即当前类所在路径及其引用的第三方类库的路径下的类库 加载到内存中。如果没有自定义过类加载器,则默认应用程序类加载器为程序默认的加载器。

3.类加载流程?

1.类加载器收到class文件加载请求
2.收到请求的加载器会将此请求委派给其父加载器进行加载,此父加载器上面还有父加载器,加载请求继续向上传递。
  所以一个类加载请求会先由最上层的加载器进行加载,如果此加载器在其范围内找到所需的类的时候,就处理成功。否则会交由其下一层的加载器(它儿子)来处理此请求。

4.获取类加载器的方法?
public static void main(String[] args) {
		Student student = new Student();
		//1.获取某class对象
		Class<? extends Student> studentClass = student.getClass();
		//2.获取该class对象的加载器
		ClassLoader classLoader = studentClass.getClassLoader();
		System.out.println(classLoader);
		//3.获取该加载器的父加载器
		ClassLoader parentClassLoader = classLoader.getParent();
		System.out.println(parentClassLoader);
		//4.获取该父加载器的父加载器
		ClassLoader grandFatherLoader = parentClassLoader.getParent();
		System.out.println(grandFatherLoader);
	}

下一篇:JVM(三)—堆、栈、方法区

发布了79 篇原创文章 · 获赞 42 · 访问量 7905

猜你喜欢

转载自blog.csdn.net/qq_43655835/article/details/103862440