JVM基础-类生命周期
前言
我们平时写的JAVA代码 ,这么运行起来的呢?一般我们部署肯定要打 “.jar” 或者 “.war” 格式的包,进行部署运行。war包借助web中间件部署启动,jar包通过手动‘ “java” 命令进行启动。中途有个非常关键的步骤,就是“编译”,编译以后的“.java”文件生成:“.class”文件。
一、类加载器概念
JVM运行一些 “.class” 字节码文件中的代码时,首先会从磁盘把这些 “.class” 文件中包含的类给加载到内存。这时会有一个 类加载器 的概念。
类加载器:负责加载编译好的 “.class” 文件到JVM中。后续通过字节码执行引擎执行文件。
二、 JVM在什么时候加载一个类?
你的代码用到这个类的时候
例子:
public class App {
public static void main ( String[] args ) {
ManagerCache managerCache = new ManagerCache ();
}
}
程序运行会通过main()方法作为入口,代码中使用了一个 ”ManagerCache“ 这个类并且去实例化了一个对象,这时候就需要把 ”ManagerCache.calss” 字节码文件中的这个类加载到内存中。
三、类的生命周期
从加载到使用一般过程
1. 加载
从磁盘加载class文件到jvm虚拟机中
2. 验证
根据当前版本的JVM虚拟机规范,检验该Class
- 文件格式验证 : 是否是已固定魔数开头,主次版本号是否在当前虚拟机处理范围
- 元数据验证: 对字节码描述的信息进行语义分析
- 字节码验证: 最核心阶段,通过数据流和控制流分析,确定程序语义合法,符合逻辑
- 符号引用验证: 确保解析动作正常执行
3. 准备阶段
JVM会对类分配内存空间,对类中static修饰的变量 分配内存空间并并赋默认值
Public class CacheManager{
public static int flushInt;
}
4. 解析阶段
把 符号引用替换为直接引用的过程 jvm对class文件进行解析运行
5. 初始化阶段-核心阶段
对变量赋值在初始化阶段
类初始化:
- new 对象时,实例化会触发类的加载和初始化全过程 先加载类,后续实例化对象
- 程序启动,加载mian()方法的主类
- 主类中如果有使用其他类,这时需要加载并初始化类,如果父类没有初始化会优先初始化父类
6. 使用
程序运行中使用该类
7. 卸载
该类被GC掉
总结
本文仅仅简单介绍了类的生命周期,后续会针对类加载器做一期介绍。