JVM——类加载器ClassLoader
1、什么是类加载器
类加载器负责加载class文件,class文件在文件的开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构。
![](https://img2020.cnblogs.com/blog/2214033/202101/2214033-20210118205757613-1398791769.png)
Class Loader只负责class文件的加载,至于他是否可以运行,则由Execution Engine决定。
![](https://img2020.cnblogs.com/blog/2214033/202101/2214033-20210118205733536-1287820896.png)
并不是所有.class文件都能被ClassLoader加载
开头标识cafe babe,且符合.class规范
2、类加载器分类
虚拟机自带的加载器:
- 启动类加载器(Bootstrap),用c++编写
- 拓展类加载器(Execution),用Java编写
- 应用程序类加载器(AppClassLoader)
用户自定义的加载器:
- java.lang.ClassLoader的子类,用户可以定制类的加载方式
public class Main {
public static void main(String[] args) {
// write your code here
Object object = new Object();
System.out.println(object.getClass().getClassLoader());
}
}
// null
// 启动类加载器是用c++语言编写
![](https://img2020.cnblogs.com/blog/2214033/202101/2214033-20210118204954395-2083938334.png)
3、双亲委派和沙箱安全
-
双亲委派机制:加载类时从最内层JVM自带的类加载器开始。当我们加载一个类时,不考虑自定义的类加载器,首先会在AppClassLoader中检查是否加载过,如果有则无需加载。如果没有,会拿到其父加载器Execution,调用父加载器的loadClass方法,父类加载器同理也会先检查是否加载过,如果有则无需加载。如果没有,拿到Execution的父加载器Bootstrap,检查是否加载过,如果有则无需加载。如果没有,已经没有父加载器,开始考虑自己是否能够加载,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有加载器能够加载,则抛出ClassNotFoundException。
-
沙箱安全机制:沙箱机制是将Java代码限定在虚拟机JVM特定运行范围之内,并且严格限制代码对本地资源的访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏。
沙箱主要限制系统资源访问,例如:CPU、内存、文件系统、网络。不同级别的沙箱对这些的先照顾也可以不一样。
双亲委派机制是为了保证沙箱安全,防止恶意代码污染Java源代码。