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(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...
随机推荐
- 【你不知道的javaScript 上卷 笔记2】 javaScript 的作用域规则
一.什么是词法作用域? 词法作用域是在定义词法阶段的作用域,就是由代码变量和作用域块写在哪里决定的,基本上词法分析器在处理代码时会保持作用域不变. 二.词法作用域特点 完全由写代码期间函数所声明的位置 ...
- JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值
在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string u ...
- [SDOI2013] 直径 - 树形dp
对于给定的一棵树,其直径的长度是多少,以及有多少条边满足所有的直径都经过该边. Solution 有点意思 先随便求一条直径(两次DFS即可),不妨设为 \(s,t\),我们知道要求的这些边一定都在这 ...
- PHPstorm配置xdebug问题小记
安装的是符合自己环境的xdebug,因为是按照xdebug官网的步骤安装的:安装什么版本检测地址:https://xdebug.org/wizard.php,安装操作复制phpinfo()内容之后点击 ...
- Mesh R-CNN 论文翻译(实验部分)
本文为 Mesh R-CNN 论文翻译(原理部分)的后续.Mesh R-CNN 原论文. 4 实验 我们在ShapeNet上对网格预测分支进行基准测试,并与最先进的方法相比较.然后,我们在野生的有 ...
- 'ssh-keygen' 不是内部或外部命令,也不是可运行的程序
右键我的电脑,点击环境变量,设置系统配置里面的Path 新增一个 D:\ruanjiananzhuangdizhi\Git\usr\bin 路径就可以了
- docker部署java应用程序
https://docs.docker.com/get-started/ 安装docker 1.安装docker apt install docker 2.配置docker加速器 安装完成后在 ...
- 【强化学习RL】必须知道的基础概念和MDP
本系列强化学习内容来源自对David Silver课程的学习 课程链接http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Teaching.html 之前接触过RL ...
- 素问 - 使用 PE、PB 做估值
摘自<小韭的学习圈> Q 哪些行业用PE看合适,哪些用PB看合适啊?其中的大致逻辑是什么? A PE = 股价 / 每股收益 使用PE的逻辑是,我们认为一个股票有价值,是因为公司未来能赚钱 ...
- 嵌入式Linux学习---进程(1)
什么是一个进程?当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程.但和程序不同的是,在这个进程中,系统可能需要再启动一个或多个进程来完成独立的多个任务.多进程编程的主要内容包括进程控制和 ...