Java - JVM - 类的生命周期
- 概述
- 简述 JVM 里 类的生命周期
- 上次写了 30%, 居然丢了
- 难受, 又要重新写
- 类的生命周期
- 加载
- 使用
- 卸载
1. 加载
- 概述
- 类型的加载
- 大体流程
- 装载
- 连接
- 验证
- 准备
- 解析(可选的)
- 初始化
- 问题: 为啥解析是可选的
- 原因
- JVM 规范没有强制规定类型解析的时机
- 不是不做, 是说可以在其他的时候做
- 原因
- 问题: 这么关键的机制, 如何触发呢
- 时机
- 主动实例化
- 这个 ps 有讲
- 主动实例化
- 时机
- 特性: 类加载 与 依赖
- 子类 与 父类
- 如果子类加载, 则它的所有父类, 必须加载完毕
- 接口
- 接口没有这种规定
- 子类 与 父类
1. 装载
- 概述
- 由一个二进制流, 得到 方法区 类数据, 和 堆区 的 Class 实例
- 基本动作
- 获取 二进制流
- 结果
- 读入完整的二进制流
- 结果
- 解析二进制流, 并填入 方法区
- 结果
- 解析二进制流为 方法区 格式
- 把类型信息, 存在 方法区
- 结果
- 创建 Class 类实例
- 结果
- 在 堆 里创建引用
- 指向 方法区 类型信息
- 结果
- 获取 二进制流
- 问题1: 二进制流
- 概述
- 承载类型信息的二进制数据流
- 例如我们常见的 class 文件
- 承载类型信息的二进制数据流
- 来源
- class 文件
- 本地文件系统的 class 文件
- classpath, 这个我也不大懂
- 网络来源
- 压缩文件
- 数据库
- 动态编译
- 运行时编译 java 源文件
- 动态生成
- 运行时生成类的 class 文件
- 本地文件系统的 class 文件
- 其他
- class 文件
- 概述
- 问题2: 解析二进制流
- 概述
- 将 class 文件转化为 方法区 的格式, 然后存在里面
- 解析
- 通常是按照 class 文件格式解析的
- 特殊时候, 也可以按别的格式解析
- 方法区
- 方法区有自己的结构
- 解析后的内容, 按方法区的结构存进去
- 概述
- 问题3: 创建 Class 实例
- 概述
- 在 堆 里创建 类型对应的 Class 实例
- Class 实例
- 指向 方法区 的类型信息
- 概述
- 类加载器
- 启动类加载器
- 时机
- jvm 启动
- 作用
- 加载必须启动类
- 时机
- 自定义类加载器
- 时机
- 运行时
- 主动初始化
- 作用
- 加载其他类
- 关系
- 是 启动类加载器 的子类
- 时机
- 启动类加载器
- 机制: 预加载
- 概述
- 类加载预料某个类型将要使用, 提前加载
- 区别
- 不是 完整加载
- 报错
- 如果装载出现了问题
- 会在 正式使用时, 才会报错
- 如果装载出现了问题
- 概述
2. 连接
1. 验证
- 概述
- 验证 类型信息 是否符合 Java 语义, 以及 安全 等
- 这块不是重点, 我就不多讲了
- 其实是不懂
- 验证内容
- 格式
- 文件格式
- 长度确认
- 魔数
- 超类
- 除了 Object , 谁都有超类
- 符号引用
- 略
- 其他兼容
- final 类不能有子类
- final 方法不能被覆盖
- 确保类型和超类没有不兼容
- 其他
- 格式
- 问题: 验证时如果需要其他类, 会触发 类加载吗?
- 结果
- 不会
- 不是主动使用
- 不会
- 结果
2. 准备
- 概述
- 类型信息通过验证, 分配内存
- 前提
- 主动使用
- 这个时候, 通常需要实例
- 所以说, 这个是 实例化 前的准备
- 主动使用
- 分配内存
- 变量
- 类变量会分配到对应的空间
- 并被赋予 默认值
- 各种 0, false, null
- 方法
- 可能会有方发表, 指向每个方法
- 特别是 继承的方法, 这样不用搜索超类
- 提高效率
- 特别是 继承的方法, 这样不用搜索超类
- 可能会有方发表, 指向每个方法
- 变量
3. 解析
- 概述
- 将 符号引用 换成 直接引用
- 略
- 因为不懂
3. 初始化
- 概述
- 初始化
- 初始值
- 赋值
- 通常是 static 值
- 类的值
- 通过
- 类变量初始化语句
- static 变量的 赋值语句
- 静态初始化语句
- 静态代码块
- 类变量初始化语句
- clinit 方法
- 来源
- 自动生成
- 内容
- static 复制语句
- 静态代码块
- 没有?
- 如果类型没有 static 内容
- 那就没有这个方法
- static final 被当做常量
- 也没有
- 如果类型没有 static 内容
- 来源
- 初始化步骤
- 如果有超类
- 初始化超类
执行 clinit 方法
- 其他
- 接口不需要执行超类的 clinit 方法
- 如果有超类
- 多线程
- 场景
- 多个线程同时触发 类加载
- 结果
- 第一个执行初始化
- 其他全部等待
- 场景
- 赋值
2. 使用
- 概述
- 其实就是对象的生命周期
- 内容
- 实例化
- 时机
- 类加载完成
- 方法
- 构造函数
- 时机
- 垃圾回收
- 这个以后单独说
- 实例化
3. 卸载
- 概述
- 类型生命周期的最后
- 对象
- 自定义装载器装载的类
- 时机
- 类型 不可触及
- 判断
- 没有明确引用
- 没有 class 类 实例
- 判断
- 类型 不可触及
ps
- ref
- 深入 Java 虚拟机
- 区别: 初始化 与 实例化
- 初始化
- 类加载的最后一步
- 实例化
- 类加载完成之后
- 结果是一个 类型的实例
- 初始化
- 主动使用 和 被动使用
- 主动使用
- 创建新实例
- 调用某个类的 静态方法
- 使用某个 类 或者 接口 的静态字段
- 除了 final 字段
- 反射方法
- 初始化某个类的子类
- 启动类
- 比如 main
- 启动时就必须使用
- 被动使用
- 主动使用
- classpath
- 寻址用, 但是我不大懂
- 对象生命周期
- 这个以后可以说说
- 实例化
- 垃圾收集
- 这个以后可以说说
- 类加载器
- 这个以后也可以说说
Java - JVM - 类的生命周期的更多相关文章
- JVM 类的生命周期、类加载器
类的加载.连接与初始化 • 1. 加载:查找并加载类的二进制数据 • 2. 连接 – 2.1 验证:确保被加载的类的正确性 ...
- JVM类加载器及Java类的生命周期
预定义类加载器(三种): 启动(Bootstrap)类加载器: 是用本地代码实现的类装入器,它负责将<Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar) ...
- Java类的生命周期详解
引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告 ...
- 【转】Java 类的生命周期详解
一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大 ...
- 【转载】详解java类的生命周期
原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑, ...
- JVM:类的生命周期
类的生命周期 综述 1. 只有当一个类被切实使用到的时候才会被加载到虚拟机中(例如:new, 方法调用, A a = null;不算) 2. 若在加载一个类的过程中,有其他类被切实使用到, ...
- [Java]类的生命周期(上)类的加载和连接[转]
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java ...
- JVM-类加载过程(Java类的生命周期)
什么是类加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的 ...
- JVM与垃圾回收机制(GC)和类的生命周期
JVM运行时数据区 GC(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...
随机推荐
- 分类问题(三)混淆矩阵,Precision与Recall
混淆矩阵 衡量一个分类器性能的更好的办法是混淆矩阵.它基于的思想是:计算类别A被分类为类别B的次数.例如在查看分类器将图片5分类成图片3时,我们会看混淆矩阵的第5行以及第3列. 为了计算一个混淆矩阵, ...
- 根据ID选中
var name = document.getElementsById("mainStack");
- NIO 和BIO
讲讲NIO? 传统的IO流是阻塞式的,会一直监听一个ServerSocket,在调用read等方法时,他会一直等到数据到来或者缓冲区已满时才返回.调用accept也是一直阻塞到有客户端连接才会返回.每 ...
- 【C/C++】最短路径
BFS求无权图的最短路径 用book数组的值表示路径长度即可,省略 Floyd算法(允许负边) Floyd算法可以一次性求出所有节点之间的最短距离,且代码简单,但是时间复杂度达到了n^3,因此只适用于 ...
- JavaScript控制流和表达式
一.with语句 使用with语句可以简化JavaScript语句的一些类型,即把一个对象的多个引用降为一个引用,对with块里的属性和方法的引用将被看作是对对象的引用. <script> ...
- HTML div标签
看成一个 纯净的箱子吧.....啥属性都没有....默认宽度100% 高度0高度是 按DIV里的 内容而变高也可以在 CSS里 设置 宽高....DIV就是 典型的 标签.. P UL LI 等 标签 ...
- 为什么 K8s 在阿里能成功(转)
为什么 K8s 在阿里能成功?| 问底中国 IT 技术演进 作者:曾凡松 阿里云云原生应用平台高级技术专家张振 阿里云云原生应用平台高级技术专家 导读:本文描述了阿里巴巴在容器管理领域的技术演进历 ...
- C语言 malloc函数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...
- Python常用的类库、对应的方法和属性
Python常用的类库.对应的方法和属性
- Map中放入对象字符串转义问题
在做Zuul网关日志处理的时候,有以下需求: (1)记录请求成功的日志,要求记录请求返回的结果. 遇到的问题: (1)当请求的结果事对象时,会将其转成字符串,在put进map的时候,字符串就会被转义 ...