JVM(三):ClassLoadingLinkingInitializing

在这里插入图片描述

  • 类加载过程
    • Loading:将Class文件加载到内存中
      • 类加载器 在这里插入图片描述

      • 类加载器中的类加载过程
        在这里插入图片描述

      • 类加载器范围

        • (来自Launcher源码)

          • sun.boot.class.path
            • Bootstrap ClassLoader加载路径
          • java.ext.dirs
            • ExtensionClassLoader加载路径
          • java.class.path
            • AppClassLoader加载路径
        • 测试代码

          package com.lele.jvm.classloader;
          
          /**
           * @author: lele
           * @date: 2021/5/3 20:30
           * @description:
           */
          public class T003_ClassLoaderScope {
              public static void main(String[] args) {
                  String pathBoot = System.getProperty("sun.boot.class.path");
                  System.out.println(pathBoot.replaceAll(";",System.lineSeparator()));
          
                  System.out.println("------------------------");
                  String pathExt = System.getProperty("java.ext.dirs");
                  System.out.println(pathExt.replaceAll(";",System.lineSeparator()));
          
                  System.out.println("------------------------");
                  String pathApp = System.getProperty("java.class.path");
                  System.out.println(pathApp.replaceAll(";",System.lineSeparator()));
          
              }
          }
          
      • 双亲委派,主要出于安全来考虑

        • 父加载器不是“类加载器的加载器”,也不是“类加载器的父类加载器”
        • 双亲委派是一个孩子向父亲方向,然后父亲向孩子方向的双亲委派过程。
      • lazyloading(lazyInitializing)必须初始化的五种情况:

        • new getstatic putstatic invokestatic指令,访问final变量除外
        • java.lang.reflect对类进行反射调用时
        • 初始化子类的时候,父类首先初始化
        • 虚拟机启动时,被执行的主类必须初始化
        • 动态语言支持java.lang.invoke.MethodHandle解析的结果为REF_getstatic REF_putstatic REF_invokestatic的方法句柄时,该类必须初始化;
      • ClassLoader的源码

        • findInCache -> parent.loadClass -> findClass()
          在这里插入图片描述
        • 如果是AppClassLoader首先会执行URLClassLoader的findClass方法
        • ClassLoader源码中用到了 模板方法 设计模式
      • 自定义类加载器

        • extends ClassLoader(继承ClassLoader)
        • overwrite findClass() -> defineClass(byte[] -> Class clazz)(重写模板方法findClass,调用defineClass)
        • 加密(自定义加载器加载自加密的class,防止反编译,防止篡改)
        • parent是用super(parent)指定;
        • 双亲委派的打破
          • 重写loadClass()可以打破双亲委派
          • 何时打破过?
            • jdk1.2之前,自定义ClassLoader都必须重写loadClass()
            • ThreadContextClassLoader可以实现基础类调用实现类代码,通过thread.setContextClassLoader指定;
            • 热启动,热部署
              • osgi tomcat 都有自己的模块指定classloader(可以加载同一类库的不同版本)
      • 混合执行 编译执行 解释执行

        • 解释器(bytecode intepreter)
        • JIT(Just In-Time compiler)
        • 混合模式
          • 混合使用解释器+热点代码编译
          • 起始阶段采用解释执行
          • 热点代码检测
            • 多次被调用的方法(方法计数器:检测方法执行效率)
            • 多次被调用的循环(循环计数器:检测循环执行效率)
            • 进行编译
        • -Xmixed 默认为混合模式,开始解释执行,启动速度较快对热点代码实行检测和编译
        • -Xint 使用纯解释模式,启动很快,执行较慢
        • -Xcomp 使用纯编译模式,执行很快,启动很慢
        • -XX:CompileThreshold=10000 检测热点代码
    • Linking
      • Verification(校验):验证文件是否符合JVM规定
      • Preparation:静态成员变量赋默认值
      • Resolution(解析):将类、方法、属性等符号引用解析为直接引用;常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用
    • Initializing:调用类初始化代码,给静态成员变量赋初始值;
  • 小总结:
    • load - 默认值 - 初始值
    • new - 申请内存 - 默认值 - 初始值
      itializing:调用类初始化代码,给静态成员变量赋初始值;
  • 小总结:
    • load - 默认值 - 初始值
    • new - 申请内存 - 默认值 - 初始值
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值