java class加载过程

Class文件执行

加载 - 连接 - 初始化

一.Loading

ClassLoader(类加载器)将资源(包括class、文件、来自网络的流)加载到内存

加载到内存会生成java内置的Class对象

1、ClassLoader的等级加载机制 :

  • BootstrapClassLoader(启动类加载器):

    加载JVM运行时所需的核心类和jar包 -主要在jre/lib/下

    C:\Program Files\Java\jre1.8.0_91\lib\resources.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\rt.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\sunrsasign.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\jsse.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\jce.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\charsets.jar;
    C:\Program Files\Java\jre1.8.0_91\lib\jfr.jar;
    C:\Program Files\Java\jre1.8.0_91\classes
    
    
  • ExtClassLoader(扩展累加载器)

    扩展类和jar加载 - jre\lib\ext\xxx.jar

  • AppClassLoader:
    加载其余jar包和自定义类

    加载自定义的class


图来源:https://blog.csdn.net/codeyanbao/article/details/82875064

  • 🐳 双亲委派机制:

    分层加载保证核心类库的安全,classLoader都会有个getParent()方法指向自己的对象是由哪个classLoader(父加载器)加载到内存中的,防止运行时上层classLoader二次加载

  • 👦自定义类加载器
    继承ClassLoader抽象类,
    重写findClass方法(得到文件IO)
    中调用defineClass方法(将二进制转成Class对象)并返回Class对象

  • 🍚LazyLoading的五种情况

    • new、getstatic、putstatic、invokestatic 指令,访问final变量除外!

    • java.lang.reflect对类进行反射调用时

    • 初始化子类时,先初始化父类

    • 虚拟机启动时,被执行的主类会被初始化

    • 动态语言支持java.lang.invoke.MethodHandle解析结果为REF_getstatic REF_putstatic、 REF_invokestatic的方法句柄是,该类必须初始化

二.Linking

1.Vertification

验证文件是否符合jvm规定

2.Preparation

静态变量 赋值为 默认值 static String s;

final成员变量(基础类型) 赋值为 默认值 final int a;

3.Resolution

☎️将类、方法、属性等符号解析为直接引用,

✌️常量池中的各种符号解析为指针、偏移量等内存地址的直接引用

三.Initializing

🆒静态成员变量 赋值为 初始值 static String s="ss";

🌔调用类构造器方法(静态代码块)

四、实例化🐱

1.申请对象内存空间

2.成员变量 赋值为 默认值

3.调用对象构造方法

  • 1)调用父类构造方法

  • 2)调用变量顺序赋初始值

  • 3)执行构造方法

posted @ 2021-07-11 00:22  赵钱富贵  阅读(364)  评论(0编辑  收藏  举报