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(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...
随机推荐
- Bootstrap框架中radio设置值
Bootstrap中的radio设置值不能像我们平常给普通radio赋值那样,因为无效. 我们用Bootstrap框架里的radio组件,代码: <div class="radio-l ...
- -bash: mysqld: command not found
网址:https://blog.csdn.net/zq199692288/article/details/78863737
- 给阿里云主机添加swap分区,解决问题:c++: internal compiler error: Killed (program cc1plus)
前言 今天安装spdlog,一个快速得C++日志库,按照文档步骤,不料出现了一堆错误,像c++: internal compiler error: Killed (program cc1plus)等一 ...
- linux 创建svn版本库,并在svn上配置checkstyle做代码风格检查
一.创建SVN版本库 1.安装svn服务器 yum install subversion 2.查看版本 svnserve --version 3.建立SVN版本库目录(即你的SVN服务器里面的文件存放 ...
- HTTP慢速攻击
漏洞原理 HTTP慢速攻击也叫slow http attack,是一种DoS攻击的方式.由于HTTP请求底层使用TCP网络连接进行会话,因此如果中间件对会话超时时间设置不合理,并且HTTP在发送请求的 ...
- Itext相关知识
最近需求用到office和pdf相关知识,office使用poi操作的,pdf则使用Itext操作 Itext官网: http://itextpdf.com/ Itext7相关使用示例:https:/ ...
- LitElement(六)生命周期
1.概述 基于LitElement的组件通过响应观察到的属性更改而异步更新. 属性更改是分批进行的,如果在请求更新后,更新开始之前,发生更多属性更改,则所有更改都将捕获在同一次更新中. 在较高级别上, ...
- 计算机网络,HTTP - 头部中带X前缀的头部字段
HTTP中,什么是"X-" Prefix header? 例如 github API 的response headers有很多X前缀的头部: 查一下MDN文档: Custom pr ...
- node安装升级过程中遇到的问题汇总
一.Node already installed, it's just not linked 第一步:sudo chown -R $(whoami) $(brew --prefix)/* 第二步:br ...
- MVC HTML辅助方法
HTML辅助方法(HTML Helper)用来辅助产生HTML,在开发View的时候会面对许多HTML标签,处理这些HTML标签非常繁琐,为了降低View的复杂度,可以使用HTML辅助方法帮助你产生一 ...