class cycle

选区_119.png

类加载器类别

选区_120.png

加载过程

将class加载到内存中,然后有classLoader对象指向这块内存(类的二进制码)

Loading

双亲委派,主要出于安全来考虑

选区_121.png

LazyLoading 五种情况

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

ClassLoader的源码

findInCache -> parent.loadClass -> findClass()
自定义类加载器
extends ClassLoader

  1. overwrite findClass() -> defineClass(byte[] -> Class clazz)
  2. 加密
  3. 第一节课遗留问题:parent是如何指定的,打破双亲委派,学生问题桌面图片
    1. 用super(parent)指定
    2. 双亲委派的打破
      1. 如何打破:重写loadClass()
      2. 何时打破过?
        1. JDK1.2之前,自定义ClassLoader都必须重写loadClass()
        2. ThreadContextClassLoader可以实现基础类调用实现类代码,通过thread.setContextClassLoader指定
        3. 热启动,热部署
          1. osgi tomcat 都有自己的模块指定classloader(可以加载同一类库的不同版本)
    3. 混合执行 编译执行 解释执行
  4. 检测热点代码:-XX:CompileThreshold = 10000

    Linking

  1. Verification
    1. 验证文件是否符合JVM规定
  2. Preparation
    1. 静态成员变量赋默认值
  3. Resolution
    1. 将类、方法、属性等符号引用解析为直接引用 常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用

      Initializing

      调用类初始化代码 ,给静态成员变量赋初始值

      编译模式

      解释器

      bytecode intepreter

      JIT

      混合模式

      混合使用解释器 + 热点代码编译
      起始阶段采用解释器执行
      热点代码检测
      多次被调用的方法 (方法技术器:检测方法执行频率)
      多次被调用的循环(循环计数器:检测循环执行频率)

      参数

      -Xmixed 默认为混合模式
      -Xint 纯解释器模式,启动很快,执行稍慢
      -Xcomp (先编译成本地代码)纯编译模式,执行很快,启动很慢