JVM——类加载器ClassLoader

1、什么是类加载器

类加载器负责加载class文件,class文件在文件的开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构。

Class Loader只负责class文件的加载,至于他是否可以运行,则由Execution Engine决定。

并不是所有.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++语言编写

3、双亲委派和沙箱安全

  • 双亲委派机制:加载类时从最内层JVM自带的类加载器开始。当我们加载一个类时,不考虑自定义的类加载器,首先会在AppClassLoader中检查是否加载过,如果有则无需加载。如果没有,会拿到其父加载器Execution,调用父加载器的loadClass方法,父类加载器同理也会先检查是否加载过,如果有则无需加载。如果没有,拿到Execution的父加载器Bootstrap,检查是否加载过,如果有则无需加载。如果没有,已经没有父加载器,开始考虑自己是否能够加载,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有加载器能够加载,则抛出ClassNotFoundException。

  • 沙箱安全机制:沙箱机制是将Java代码限定在虚拟机JVM特定运行范围之内,并且严格限制代码对本地资源的访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏
    沙箱主要限制系统资源访问,例如:CPU、内存、文件系统、网络。不同级别的沙箱对这些的先照顾也可以不一样。

双亲委派机制是为了保证沙箱安全,防止恶意代码污染Java源代码。

posted @ 2021-01-18 20:59  又又又8  阅读(76)  评论(0编辑  收藏  举报