0
点赞
收藏
分享

微信扫一扫

JVM基础-类生命周期

王小沫 2022-04-18 阅读 248
java

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

  1. 文件格式验证 : 是否是已固定魔数开头,主次版本号是否在当前虚拟机处理范围
  2. 元数据验证: 对字节码描述的信息进行语义分析
  3. 字节码验证: 最核心阶段,通过数据流和控制流分析,确定程序语义合法,符合逻辑
  4. 符号引用验证: 确保解析动作正常执行

3. 准备阶段

JVM会对类分配内存空间,对类中static修饰的变量 分配内存空间并并赋默认值

Public class CacheManager{
	public static int flushInt;
}

4. 解析阶段

符号引用替换为直接引用的过程 jvm对class文件进行解析运行

5. 初始化阶段-核心阶段

对变量赋值在初始化阶段

类初始化:

  1. new 对象时,实例化会触发类的加载和初始化全过程 先加载类,后续实例化对象
  2. 程序启动,加载mian()方法的主类
  3. 主类中如果有使用其他类,这时需要加载并初始化类,如果父类没有初始化会优先初始化父类

6. 使用

程序运行中使用该类

7. 卸载

该类被GC掉


总结

本文仅仅简单介绍了类的生命周期,后续会针对类加载器做一期介绍。


举报

相关推荐

0 条评论