Java虚拟机——虚拟机类的加载机制

一、类的加载器

1、类的加载

   当你的程序中要用到某个类时,如果这个类还未被加载到内存中,系统就会通过加载,链接,初始化三个步骤来实现对这个类的初始化。

   1、 加载: 
            就是将类的.class文件读进内存中,并为之创建一个Class对象,
            任何类被使用时系统都会创建一个Class对象。
   2、 链接
            验证:验证类是否符合JVM的规范,并和其他的类协调一致,
            准备:负责给类的静态成员分配内存,并设置默认初始化值,
            解析:虚拟机将常量池中的符号引用替换为直接引用。
   3、初始化
            执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译期自动收集类中的所有类变量的赋值动作和静态代码块
            中的语句合并产生的,
            当初始化一个类的时候,会先对其父类进行初始化,
            虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。         

2、类的初始化时机

   (1)创建类的实例化对象;
   (2)使用类的静态变量,或为其静态变量赋值;
   (3)使用类的静态方法;
   (4)使用反射方式来强制创建某个类的 java.lang.Class 对象;
   (5)初始化某个类的子类;

3、类加载器

   类加载器是用来把类加载进内存的,并为之生成对应的Class对象。

    类加载器的组成:
      1、BootStrap ClassLoader :启动类加载器,使用C++写的,是JVM自带的类加载器,负责Java平台的核心库,用来装载核心类库。
         该加载器无法直接获取。
      2、Extension ClassLoader : 扩展类加载器,负责jre/lib/ext目录下的jar包或java.ext.dirs系统变量所指定的路径中的所有
         类库装入工作室。
      3、System ClassLoader : 系统类加载器,负责加载用户类路径(ClassPath)上所指定的类库,程序员人员可以直接这个加载器,
         如果应用程序中没有自定义的类加载器,一般情况下这个就是程序中的默认类加载器。
      4、自定义类加载器 

4、类加载器双亲委派模型

在这里插入图片描述
双亲委派模型的工作工程是: 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器,每一层的加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器, 只有当父加载器反馈自己无法完成这个请求的时候 (它的搜索范围中没有找到所需的类) ,子加载器才会尝试自己去加载。
  使用双亲委派模型来组织类加载器之间的关系,有一个显而易见的好处就是 Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如 java.lang.Object ,它存放在 rt.jar 之中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。如果没有使用双亲委派模型,由各个类加载器自己去加载的话,如果用户自己编写了一个名为 java.lang.Object 的类,并放在程序的ClassPath中,那系统中就会出现多个不同的Object类,Java类型体系中最基础的行为也就无法保证,应用程序也就变得混乱。

代码演示:

public class Test {
    public static void main(String[] args) {
        //获取Test类的加载器
        ClassLoader classLoader = Test.class.getClassLoader();
        System.out.println(classLoader);
        //获取扩展类加载器
        ClassLoader parent = classLoader.getParent();
        System.out.println(parent);
        //获取启动类加载器,因为是用C++实现的,Java无法调用查看,返回null
        ClassLoader parent1 = parent.getParent();
        System.out.println(parent1);
    }
}

执行结果:
在这里插入图片描述

发布了58 篇原创文章 · 获赞 7 · 访问量 2282

猜你喜欢

转载自blog.csdn.net/weixin_42492089/article/details/103452287