栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

类的加载全过程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

类的加载全过程

1.什么是类的加载

虚拟机把描述类的数据从Class文件加载到内存,并为之创建一个java.lang.Class对象,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。也就是说程序使用任何类时,系统都会为之建立一个java.lang.Class对象。

2.类的生命周期

类的生命周期包括这5个部分,加载、连接、初始化、使用和卸载,其中前三部是类的加载的过程,如下图;

  • 加载(Loading):java文件加载成 Class 文件,在堆中创建一个java.lang.Class类的对象
  • 连接
    • 验证(Verification):确保加载的class文件符合JVM规范(验证格式、依赖元数据、字节码、符号引用验证)
    • 准备(Preparation):为静态变量,分配内存空间并设置初始值
    • 解析(Resolution):JVM常量池中的符号引用(常量名)替换为直接引用(地址引用)
  • 初始化(Initialization):构造器、静态变量赋值、静态代码块
    • 当初始化一个类时,如果发现其父类没有进行初始化,则先对其父类继续出初始化。
  • 使用(Using): new出的对象程序中使用
  • 卸载(Unloading) : 执行垃圾回收

其中,解析这步骤的顺序是不确定的,当存在动态绑定情况时(如重写和实现接口),解析出现在程序的运行期,而静态绑定相关的解析存在程序的编译期。

3.类加载的时机
  • 创建类的实例new一个对象时 ;
  • 访问类的静态变量(被final修饰、已在编译期把结果放入常量池的静态字段除外) ;
  • 访问类的静态方法 ;
  • 反射获取类 (Class.forName("my.xyz.Test")) ;
  • 当初始化一个类时,若其父类还未初始化,则先触发父类的初始化 ;
  • 虚拟机启动时,定义了main()方法的那个类先初始化 ;
    • 主动引用:上面这些种行为称为对一个类的的主动引用,会触发类的初始化
    • 被动引用:除上面五种主动引用之外,其他引用类的方式都不会触发类的初始化,称为类的被动引用
4.什么时候结束生命周期
  • 程序正常执行结束
  • 程序在执行过程中遇到了异常或错误而异常终止
  • 由于操作系统出现错误而导致Java虚拟机进程终止
  • 执行了 System.exit()方法
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/582051.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号