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. PIE-SDK For C++栅格数据的金字塔创建

    1.功能简介 金字塔可用于改善性能,可以加快栅格数据的显示速度.随着放大操作的进行,各个更精细的分辨率等级将逐渐得到绘制;但性能将保持不变:目前PIE SDK支持栅格数据的金字塔创建,下面对栅格数据格 ...

  2. [JSOI2013] 快乐的 JYY - 回文自动机,DFS

    #include <bits/stdc++.h> #define Sigma 30 #define MAXN 500010 #define int long long using name ...

  3. phpstorm同步服务器文件

    配置服务器 1.连接配置 打开菜单栏 Tools -> Deployment -> Configuration 点击 + 选择 SFTP,并填写相关服务器信息: Type:连接类型,这里选 ...

  4. python Threading模块源码解析

    查看源码: 这是一个线程控制的类,这个类可以被子类化(继承)在一定的条件限制下,这里有两种方式去明确活动:第一通过传入一个callable 对象也就是调用对象,一种是通过重写这个Thread类的run ...

  5. Docker最全教程——从理论到实战(十三)

    前言 树莓派(Raspberry Pi)是一台卡片电脑(只有信用卡大小),我们可以使用树莓派做很多事情,比如智能家居的中控.航空器.BT下载器.挖矿机.智能机器人.小型服务器(花生壳+网站)等等. 目 ...

  6. phpstorm实用技巧

    1.切换php代码版本提示 1.1找到External Libraries右键点击(configure PHP Include Paths) 1.2切换提示版本(在这里切换版本)确定即可 2.生成ge ...

  7. 【网站】 简单通用微信QQ跳转浏览器打开代码

    使用方法: 将代码全部复制 粘贴到 网站根目录下index.php文件的顶端 注意:不要覆盖了 index.php里面的原代码,原代码保留 使用说明: 手机QQ内打开,会自动跳转浏览器: 微信内打开, ...

  8. Dockerfile深度剖析

    Dockerfile主要是用来定制镜像   Dockerfile指令集 FROM ###指定基础镜像第一条指令.scratch是虚拟的镜像,表示一个空白的镜像. FROM centos:7.5 MAI ...

  9. css 页面滚动 多背景固定不动

    经常看到一些网站,滚动页面但是背景图不会跟着滚动,好像一直固定在浏览器窗口,感觉挺酷的,哇哦 ~ ~ 原来都是 background-attachment 这位大兄弟的功劳 background-at ...

  10. spring自动装配和通过java实现装配

    1.组建扫描 在类上添加注解@Component注解可以实现组建扫描 @Component public class A{ ... } 2.自动装配 通过在属性上或者方法上添加@Autowired注解 ...