Java 类加载器

类加载过程

我们编写的一个Java类是怎么加载到Java虚拟机里面的呢?
首先.java文件会先编译成.class文件,Java虚拟机只认识class文件。
然后就会启动加载程序

加载过程

类的加载过程
load–>linking–>Initializing

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
Linking
  1. Verification
     1. 验证文件是否符合JVM规定
  2. Preparation
     1. 静态成员变量赋默认值
  3. Resolution
     1. 将类、方法、属性等符号引用解析为直接引用
        常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用
Initializing
  1. 调用类初始化代码 <clinit>,给静态成员变量赋初始值

双亲委派模型

双亲委派模型

  1. 小总结:

    1. load–>linking–>Initializing(加载过程)
    2. load - 默认值 - 初始值
    3. new - 申请内存 - 默认值 - 初始值
  2. 对象的创建过程

    1. 判断类是否已经加载,没有加载就去加载
    2. 分配内存空间
    3. 设置于零值
    4. 设置对象头
    5. 初始化
    6. 设置引用指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值