zoukankan      html  css  js  c++  java
  • Class的加载过程

    1:类加载-初始化

    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 尝试从缓存中获取
          2. parent.loadClass 不断往上的尝试获取(双亲委派,自定义ClassLoader->AppClassLoader->ExtClasssLoader->BootStrapClassLoader)
          3. findClass() 模板方法中需要被覆盖的方法,用来扩展自定义的ClassLoader
        4. 自定义类加载器

          1. extends ClassLoader
          2. overwrite findClass() -> 最终调用:defineClass(byte[] -> Class clazz)
          3. 加密,可以用证书进行加解密,原理相对简单;无非就是对class文件进行证书加密,在定义的ClassLoader中对加密后的class文件进行解密;只要保证证书的安全即可
          4. 打破双亲委派
            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 class
        1. 静态变量赋默认值
        2. 静态变量赋初始值
      2. new 对象  
        1. 申请内存
        2. 成员变量赋默认值
        3. 成员变量赋初始值
  • 相关阅读:
    [工具分享]JetBrains ReSharper 9.0 正式版和注册码
    JAVA数据库连接池的革命 -- 从BoneCP到HikariCP
    【C#教程10】C# 判断
    【C#教程09】C# 运算符
    【C#教程07】C# 变量
    【C#教程06】C# 类型转换
    【C# 教程05】C# 数据类型
    【C# 教程04】C# 基本语法
    【C# 教程03】C# 程序结构
    【C#教程02】C# 环境
  • 原文地址:https://www.cnblogs.com/gabin/p/13598553.html
Copyright © 2011-2022 走看看