java类加载机制简介---JVM
Posted 如月之恒-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java类加载机制简介---JVM相关的知识,希望对你有一定的参考价值。
文章目录
类加载器介绍
类加载器种类
-
启动类加载器(也叫引导类加载器。Bootstrap):这个类加载器负责放在<JAVA_HOME>\\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库。负责加载jre的核心类库,如jre目标下的rt.jar等等,用户无法直接使用。
Bootstrap类加载器没有任何父类加载器,如果你调用String.class.getClassLoader(),会返回null,任何基于此的代码会抛出NUllPointerException异常。Bootstrap加载器被称为初始类加载器。 -
扩展类加载器(Extension):这个类加载器由sun.misc.Launcher$ExtClassLoader实现。它负责<JAVA_HOME>\\lib\\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库。用户可以直接使用。
-
应用程序类加载器(Application):这个类由sun.misc.Launcher$AppClassLoader实现。是ClassLoader中getSystemClassLoader()方法的返回值。它负责用户路径(ClassPath)所指定的类库。用户可以直接使用。如果用户没有自己定义类加载器,默认使用这个。
-
自定义加载器:用户自己定义的类加载器。
代码示例:
package test;
public class TestJDKClassLoader
public static void main(String[] args)
System.out.println(String.class.getClassLoader());
System.out.println(com.sun.crypto.provider.DESKeyFactory.class.getClassLoader().getClass().getName());
System.out.println(TestJDKClassLoader.class.getClassLoader().getClass().getName());
System.out.println(ClassLoader.getSystemClassLoader().getClass().getName());
TestJDKClassLoader运行结果:
null
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$AppClassLoader
类加载机制
类加载机制分为:双亲委派机制和全盘负责委托机制。
双亲委派机制
含义
当需要加载一个类的时候,子类加载器并不会马上去加载,而是依次去请求父类加载器加载,一直往上请求到最高类加载器:启动类加载器。当启动类加载器加载不了的时候,依次往下让子类加载器进行加载。当达到最底下的时候,如果还是加载不到该类,就会出现ClassNotFound的情况。
注意:父类加载器和子类加载器不同于ava代码中父类子类的关系,不是继承制,而是AppClassLoader中有一个ExtClassLoader的引用,
好处:
- 沙箱安全机制:保证了程序的安全性。
例子:比如我们重新写了一个String类,加载的时候并不会去加载到我们自己写的String类,因为当请求上到最高层的时候,启动类加载器发现自己能够加载String类,因此就不会加载到我们自己写的String类了。 - 避免重复加载。父类加载器加载后子类加载器就不会加载。
全盘负责委托机制
含义
“全盘负责”是指当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,则该类所依赖及引用的类也由这个CladdLoader载入。
例如:系统类加载器AppClassLoader加载入口类(含有main方法的类)时,会把main方法所依赖的类及引用的类也载入,依此类推。“全盘负责”机制也可称为当前类加载器负责机制。显然,入口类所依赖的类及引用的类的当前类加载器就是入口类的类加载器。
注
- 文章是个人知识点整理总结,如有错误和不足之处欢迎指正。
- 如有疑问、或希望与笔者探讨技术问题(包括但不限于本章内容),欢迎添加笔者微信(o815441)。请备注“探讨技术问题”。欢迎交流、一起进步。
以上是关于java类加载机制简介---JVM的主要内容,如果未能解决你的问题,请参考以下文章