1. 概述

    1. 简述 JVM 里 类的生命周期
    2. 上次写了 30%, 居然丢了
      1. 难受, 又要重新写
  2. 类的生命周期
    1. 加载
    2. 使用
    3. 卸载

1. 加载

  1. 概述

    1. 类型的加载
  2. 大体流程
    1. 装载
    2. 连接
      1. 验证
      2. 准备
      3. 解析(可选的)
    3. 初始化
  3. 问题: 为啥解析是可选的
    1. 原因

      1. JVM 规范没有强制规定类型解析的时机
      2. 不是不做, 是说可以在其他的时候做
  4. 问题: 这么关键的机制, 如何触发呢
    1. 时机

      1. 主动实例化

        1. 这个 ps 有讲
  5. 特性: 类加载 与 依赖
    1. 子类 与 父类

      1. 如果子类加载, 则它的所有父类, 必须加载完毕
    2. 接口
      1. 接口没有这种规定

1. 装载

  1. 概述

    1. 由一个二进制流, 得到 方法区 类数据, 和 堆区 的 Class 实例
  2. 基本动作
    1. 获取 二进制流

      1. 结果

        1. 读入完整的二进制流
    2. 解析二进制流, 并填入 方法区
      1. 结果

        1. 解析二进制流为 方法区 格式
        2. 把类型信息, 存在 方法区
    3. 创建 Class 类实例
      1. 结果

        1. 在 堆 里创建引用
        2. 指向 方法区 类型信息
  3. 问题1: 二进制流
    1. 概述

      1. 承载类型信息的二进制数据流

        1. 例如我们常见的 class 文件
    2. 来源
      1. class 文件

        1. 本地文件系统的 class 文件

          1. classpath, 这个我也不大懂
        2. 网络来源
        3. 压缩文件
        4. 数据库
        5. 动态编译
          1. 运行时编译 java 源文件
        6. 动态生成
          1. 运行时生成类的 class 文件
      2. 其他
  4. 问题2: 解析二进制流
    1. 概述

      1. 将 class 文件转化为 方法区 的格式, 然后存在里面
    2. 解析
      1. 通常是按照 class 文件格式解析的
      2. 特殊时候, 也可以按别的格式解析
    3. 方法区
      1. 方法区有自己的结构
      2. 解析后的内容, 按方法区的结构存进去
  5. 问题3: 创建 Class 实例
    1. 概述

      1. 在 堆 里创建 类型对应的 Class 实例
    2. Class 实例
      1. 指向 方法区 的类型信息
  6. 类加载器
    1. 启动类加载器

      1. 时机

        1. jvm 启动
      2. 作用
        1. 加载必须启动类
    2. 自定义类加载器
      1. 时机

        1. 运行时
        2. 主动初始化
      2. 作用
        1. 加载其他类
      3. 关系
        1. 是 启动类加载器 的子类
  7. 机制: 预加载
    1. 概述

      1. 类加载预料某个类型将要使用, 提前加载
    2. 区别
      1. 不是 完整加载
    3. 报错
      1. 如果装载出现了问题

        1. 会在 正式使用时, 才会报错

2. 连接

1. 验证

  1. 概述

    1. 验证 类型信息 是否符合 Java 语义, 以及 安全 等
    2. 这块不是重点, 我就不多讲了
      1. 其实是不懂
  2. 验证内容
    1. 格式

      1. 文件格式
      2. 长度确认
      3. 魔数
    2. 超类
      1. 除了 Object , 谁都有超类
    3. 符号引用
    4. 其他兼容
      1. final 类不能有子类
      2. final 方法不能被覆盖
      3. 确保类型和超类没有不兼容
    5. 其他
  3. 问题: 验证时如果需要其他类, 会触发 类加载吗?
    1. 结果

      1. 不会

        1. 不是主动使用

2. 准备

  1. 概述

    1. 类型信息通过验证, 分配内存
  2. 前提
    1. 主动使用

      1. 这个时候, 通常需要实例
      2. 所以说, 这个是 实例化 前的准备
  3. 分配内存
    1. 变量

      1. 类变量会分配到对应的空间
      2. 并被赋予 默认值
        1. 各种 0, false, null
    2. 方法
      1. 可能会有方发表, 指向每个方法

        1. 特别是 继承的方法, 这样不用搜索超类

          1. 提高效率

3. 解析

  1. 概述

    1. 将 符号引用 换成 直接引用
    1. 因为不懂

3. 初始化

  1. 概述

    1. 初始化
  2. 初始值
    1. 赋值

      1. 通常是 static 值
      2. 类的值
    2. 通过
      1. 类变量初始化语句

        1. static 变量的 赋值语句
      2. 静态初始化语句
        1. 静态代码块
    3. clinit 方法
      1. 来源

        1. 自动生成
      2. 内容
        1. static 复制语句
        2. 静态代码块
      3. 没有?
        1. 如果类型没有 static 内容

          1. 那就没有这个方法
        2. static final 被当做常量
          1. 也没有
    4. 初始化步骤
      1. 如果有超类

        1. 初始化超类
      2. 执行 clinit 方法

      3. 其他
        1. 接口不需要执行超类的 clinit 方法
    5. 多线程
      1. 场景

        1. 多个线程同时触发 类加载
      2. 结果
        1. 第一个执行初始化
        2. 其他全部等待

2. 使用

  1. 概述

    1. 其实就是对象的生命周期
  2. 内容
    1. 实例化

      1. 时机

        1. 类加载完成
      2. 方法
        1. 构造函数
    2. 垃圾回收
      1. 这个以后单独说

3. 卸载

  1. 概述

    1. 类型生命周期的最后
  2. 对象
    1. 自定义装载器装载的类
  3. 时机
    1. 类型 不可触及

      1. 判断

        1. 没有明确引用
        2. 没有 class 类 实例

ps

  1. ref

    1. 深入 Java 虚拟机
  2. 区别: 初始化 与 实例化
    1. 初始化

      1. 类加载的最后一步
    2. 实例化
      1. 类加载完成之后
      2. 结果是一个 类型的实例
  3. 主动使用 和 被动使用
    1. 主动使用

      1. 创建新实例
      2. 调用某个类的 静态方法
      3. 使用某个 类 或者 接口 的静态字段
        1. 除了 final 字段
      4. 反射方法
      5. 初始化某个类的子类
      6. 启动类
        1. 比如 main
        2. 启动时就必须使用
    2. 被动使用
  4. classpath
    1. 寻址用, 但是我不大懂
  5. 对象生命周期
    1. 这个以后可以说说

      1. 实例化
      2. 垃圾收集
  6. 类加载器
    1. 这个以后也可以说说

Java - JVM - 类的生命周期的更多相关文章

  1. JVM 类的生命周期、类加载器

    类的加载.连接与初始化                  • 1. 加载:查找并加载类的二进制数据         • 2. 连接             – 2.1 验证:确保被加载的类的正确性   ...

  2. JVM类加载器及Java类的生命周期

    预定义类加载器(三种): 启动(Bootstrap)类加载器: 是用本地代码实现的类装入器,它负责将<Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar) ...

  3. Java类的生命周期详解

    引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告 ...

  4. 【转】Java 类的生命周期详解

    一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大 ...

  5. 【转载】详解java类的生命周期

    原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑, ...

  6. JVM:类的生命周期

    类的生命周期 综述 1.    只有当一个类被切实使用到的时候才会被加载到虚拟机中(例如:new, 方法调用, A a = null;不算) 2.    若在加载一个类的过程中,有其他类被切实使用到, ...

  7. [Java]类的生命周期(上)类的加载和连接[转]

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java ...

  8. JVM-类加载过程(Java类的生命周期)

    什么是类加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的 ...

  9. JVM与垃圾回收机制(GC)和类的生命周期

    JVM运行时数据区 GC(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...

随机推荐

  1. 分类问题(三)混淆矩阵,Precision与Recall

    混淆矩阵 衡量一个分类器性能的更好的办法是混淆矩阵.它基于的思想是:计算类别A被分类为类别B的次数.例如在查看分类器将图片5分类成图片3时,我们会看混淆矩阵的第5行以及第3列. 为了计算一个混淆矩阵, ...

  2. 根据ID选中

    var name = document.getElementsById("mainStack");

  3. NIO 和BIO

    讲讲NIO? 传统的IO流是阻塞式的,会一直监听一个ServerSocket,在调用read等方法时,他会一直等到数据到来或者缓冲区已满时才返回.调用accept也是一直阻塞到有客户端连接才会返回.每 ...

  4. 【C/C++】最短路径

    BFS求无权图的最短路径 用book数组的值表示路径长度即可,省略 Floyd算法(允许负边) Floyd算法可以一次性求出所有节点之间的最短距离,且代码简单,但是时间复杂度达到了n^3,因此只适用于 ...

  5. JavaScript控制流和表达式

    一.with语句 使用with语句可以简化JavaScript语句的一些类型,即把一个对象的多个引用降为一个引用,对with块里的属性和方法的引用将被看作是对对象的引用. <script> ...

  6. HTML div标签

    看成一个 纯净的箱子吧.....啥属性都没有....默认宽度100% 高度0高度是 按DIV里的 内容而变高也可以在 CSS里 设置 宽高....DIV就是 典型的 标签.. P UL LI 等 标签 ...

  7. 为什么 K8s 在阿里能成功(转)

    为什么 K8s 在阿里能成功?| 问底中国 IT 技术演进   作者:曾凡松 阿里云云原生应用平台高级技术专家张振 阿里云云原生应用平台高级技术专家 导读:本文描述了阿里巴巴在容器管理领域的技术演进历 ...

  8. C语言 malloc函数

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.                                                 ...

  9. Python常用的类库、对应的方法和属性

    Python常用的类库.对应的方法和属性

  10. Map中放入对象字符串转义问题

    在做Zuul网关日志处理的时候,有以下需求: (1)记录请求成功的日志,要求记录请求返回的结果. 遇到的问题: (1)当请求的结果事对象时,会将其转成字符串,在put进map的时候,字符串就会被转义 ...