对象的创建

  1. 创建对象

    1. 像Spring框架中,类一般都是单例,在创建之前会判断是否创建过。未创建,或者作用域非单例,则会新建对象。
  2. class格式的二进制字节流

    1. class 规定的是字节的格式。
    2. 可以从文件,网络,数据库,其他文件中获取。
  3. 需要检测类是否加载 运行时加载

    1. 如何判断的?当前类加载器-> 双亲委派模型
    2. 根据类加载器判断class 是否被加载
    3. 两个类是否相同
      1. 类的加载器相同
      2. 类的全限定名一致
  4. 如何加载,通常类加载器

    1. 双亲委派模型,为了保证类相同、不重复加载
      1. 先检查自己是否加载过。没有,下一步
      2. 自己先不加载,委托组合的加载类加载。
      3. 加载不了,才自己去加载
      4. 最顶端是 Boostrap类加载器--只识别某些设定的class
    2. 模型的破坏
      1. 模型后提出的,so
      2. 越是基础的类由越上层的加载器加载,如果基础类需要回调用户的代码,bootsrap 及时扫描到也不会加载,只好委托子类加载器(线程上下文类加载器)加载。
        1. SPI,JDBC
      3. OSGI介绍下。
        1. 模块化热部署。每个模块都有自己的类加载器
        2. 特定类交给父类加载器,其余的要么自己加载,要么交给平级的类加载器
  5. 加载class

    1. 验证
    2. 准备 - 分配方法区内存 常量池,设置类变量的零值
    3. 解析 加载涉及到的类-伴随着验证
    4. 类的初始化,初始化类变量:static 模块等
    5. 可被虚拟机直接使用额Java类型
  6. 分配内存 - 堆对象内存

  7. 设置零值

  8. 设定对象头、类信息、GC年龄段

  9. 初始化实例变量等。

猜你喜欢

转载自www.cnblogs.com/liuguobin/p/8979337.html