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(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...
随机推荐
- web 项目添加 x86 的dll 引用,模块 DLL c:\WINDOWS\system32\inetsrv\aspnetcore.dll 未能加载。
最近的项目要添加一个 x86 编译的dll, 首先添加引用,编译,报错: 首先判断是 项目中不能添加 x86 的引用,所以把所有的项目都按照 x86 的方式编译一遍,同时对应IIS 的应用池,也修改为 ...
- bat文件一键运行python自动化脚本
目标:建立一个双击即可运行自动化脚本的机制,而不用每次运行编译器,方便测试人员用户体验. 方法: 1. 将所有代码打包成exe文件,但一旦修改,又要重新打包. 2. 将运行代码写成bat文件,双击即执 ...
- .NET知识梳理——4.特性Attribute
1. 特性 1.1 特性Attribute 特性就是一个类,继承自Attribute抽象类(该类无抽象方法.避免实例化),约定俗成用Attribute类结尾,标记时可省略掉Attribu ...
- JS高级---创建正则表达式对象
创建正则表达式对象 两种: 1.通过构造函数创建对象 2.字面量的方式创建对象 正则表达式的作用: 匹配字符串的 //对象创建完毕--- var reg = new RegExp(/\d{5} ...
- 全排列(dfs-有重复数字)
给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列.例如:S = "1312", 输出为: 1123 1132 1213 1231 131 ...
- WDatePicker使用 出现ReferenceError: disabledDates is not defined
"ReferenceError: disabledDates is not defined at eval (eval at <anonymous> at HTMLInputEl ...
- VScode 编辑器快捷键被占用
在家办公这个开发环境实在是让人受不鸟 .mysql .vscode 对连QQ都没有运行还是不行.排查最终发现了这个家伙—搜狗输入法.微软输入法 这两个把系统快捷键占得那个全 我这个全局搜索死活用不了, ...
- [LOJ144] DFS 序 1 - DFS序 线段树
为熟悉机房键盘而划水 #include <bits/stdc++.h> using namespace std; #define int long long const int N = 4 ...
- oracle数据库操作 接口封装
1.如下 using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using Sy ...
- SVN提交时没有写注释
会报错: Error: Commit blocked by pre-commit hook (exit code 1) with output: Error: [Commit failed]: Emp ...