浅谈JVM双亲委派机制

1.JVM模型图如下浅谈JVM双亲委派机制_第1张图片

2.双亲委派机制

双亲委派机制存在于类加载器中,JVM在初始化的时候,会将类模板、即.class文件加载进方法区中,例如String类,Object类等等。加载器调用的顺序如下

在加载类的时候,会逐层的先上委托,让自己的上一级先去加载这个类。为什么引入这样的机制呢?假设我们自行编写另一个String类。并且包名也和JAVA中的一样,并且也使用这个String进行开发,在编译的时候,我们知道,由于存在双亲委派机制,加载进JVM中的String类不会是我们编写的那个类,而是由引导类加载器加载进来的JAVA自带的String类,因为String类属于JAVA中已经存在的基本类。这样做的目的就是为了

  • 防止重复加载同一个类模板信息。
  • 保证核心类模板不能被篡改。

3.获取类加载器

如何知道我们的类是由那个加载器加载的呢?

public class Demo {
    public static void main(String[] args) throws Exception {
    	//获取Class的3种方式
        //1 类名.class
        ClassLoader classLoader1 = String.class.getClassLoader();
        //2 Class.forName('全路径包名')
        ClassLoader classLoader2 = Class.forName("java.lang.String").getClassLoader();
        //3 对象.getClass()
        Demo demo = new Demo();
        ClassLoader classLoader3 = demo.getClass().getClassLoader();
        System.out.println(classLoader1);
        System.out.println(classLoader2);
        System.out.println(classLoader3);
    }
}

结果如下:

null
null
sun.misc.Launcher$AppClassLoader@18b4aac2

我们知道,String的类加载器应该是BootstrapClassLoader,为什么打印出null呢?因为BootstrapClassLoader是由C++实现的,java无法获取详细信息,就好像String无法干扰native方法一样

你可能感兴趣的:(JAVA知识,java)