• JVM类加载器工作流程


      类加载器

      classloader:谈到类加载,不得不提的就是负责此项工作的类加载器classloader,classloader的职责是将Java源文件编译后的字节码文件加载到内存中去执行。

      类加载至卸载过程

      

      步骤一、类加载机制

      当系统运行时,类加载器将.class文件的二进制数据从外部存储器(如光盘,硬盘)调入内存中,CPU再从内存中读取指令和数据进行运算,并将运算结果存入内存中。内存在该过程中充当着"二传手"的作用,通俗的讲,如果没有内存,类加载器从外部存储设备调入.class文件二进制数据直接给CPU处理,而由于CPU的处理速度远远大于调入数据的速度,容易造成数据的脱节,所以需要内存起缓冲作用。

      类将.class文件加载至运行时的方法区后,会在堆中创建一个Java.lang.Class对象,用来封装类位于方法区内的数据结构,该Class对象是在加载类的过程中创建的,每个类都对应有一个Class类型的对象,Class类的构造方法是私有的,只有JVM能够创建。因此Class对象是反射的入口,使用该对象就可以获得目标类所关联的.class文件中具体的数据结构。

      类加载的最终产物就是位于堆中的Class对象(注意不是目标类对象),该对象封装了类在方法区中的数据结构,并且向用户提供了访问方法区数据结构的接口,即Java反射的接口。

      步骤二、连接过程

      (1)验证:确保被加载类的正确性,即确保被加载的类符合javac编译的规范

      (2)准备:为类的静态变量分配内存,并初始化为默认值

      (3)解析:将类中的符号引用转化为直接引用

       注:符号引用即一个Java源文件在被编译时,在不清楚被引用类实际内存地址的情况下,会使用能唯一识别并定位到目标的符号来代替。如A类引用了B类,编译时A并不知道B类实际的内存地址,故可以使用能唯一识别B的符号来代替。而当类加载时,编译后的.class文件实际已被调入内存,可知道A,B类的实际内存地址,当引用的目标已被加载入内存,则此时的引用为直接引用。

      步骤三、初始化

      初始化过程为类的静态变量赋予正确的初始值(与连接过程的准备阶段不同,如int类型的静态变量,JVM的默认值为0,遇到static int a = 3的代码时,准备阶段首先是赋值为0,初始化阶段才赋值为3)

  • 相关阅读:
    Android 存储 SD卡
    Android 存储 内部存储
    Android 存储 SP存储
    go goroutine
    go 接收命令行参数
    go 文件操作 复制和统计字符
    go 文件操作 判断文件是否存在
    換博客了,新地址https://cutepig123.github.io/
    光盘是个好东西
    俺买过的电子产品
  • 原文地址:https://www.cnblogs.com/jiyukai/p/6637796.html
Copyright © 2020-2023  润新知