Skip to content

Latest commit

 

History

History
59 lines (40 loc) · 2.22 KB

02_ClassLodingLinkingInitializing.md

File metadata and controls

59 lines (40 loc) · 2.22 KB

3:类加载-初始化

  1. 加载过程

    1. Loading

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

      2. LazyLoading 五种情况

        1. –new getstatic putstatic invokestatic指令,访问final变量除外

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

          –初始化子类的时候,父类首先初始化

          –虚拟机启动时,被执行的主类必须初始化

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

      3. ClassLoader的源码

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

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

        1. 检测热点代码:-XX:CompileThreshold = 10000
    2. Linking

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

      1. 调用类初始化代码 ,给静态成员变量赋初始值
  2. 小总结:

    1. load - 默认值 - 初始值
    2. new - 申请内存 - 默认值 - 初始值