Java类的生命周期

1. Java虚拟机和程序的生命周期

当通过java命令运行一个Java程序时,就启动了一个Java虚拟机进程。Java虚拟机进程从启动到终止时,称为Java虚拟机的生命周期。在以下情况下,Java虚拟机将结束生命周期:

  • 程序正常结束。
  • 程序在执行中因为出现异常或者错误而异常终止。
  • 执行了System.exit()。
  • 由于操作系统出现错误而导致Java虚拟机进程终止。
    Java程序从开始运行到终止的过程称为程序的生命周期,它和Java虚拟机的生命周期是一致的。

2. 类的加载、连接和初始化

当需要使用某个类时,Java虚拟机会确保这个类已经被加载、连接和初始化。其中连接过程又包括验证、准备和解析这三个步骤。这些步骤按照以下顺序运行:
(1)加载:查找并加载类的二进制数据。
(2)连接:包括验证、准备、和解析类的二进制数据。
验证:确保加载类的正确性。
准备:为类的静态变量分配内存,并将其初始化为默认值。
解析:把类中的符号引用转变为直接引用。
(3)初始化:把类的静态变量赋予正确的初始值。只有首次使用的时候才会执行初始化。

2.1 类的加载

类加载时会将.class文件中的二进制数据放入运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类加载最终就是形成这样一个堆区的Class对象。
类的加载由类加载器来负责,类加载器可以是虚拟机自带的加载器,也可以是用户自定义的加载器。

2.2 类的验证

类加载完成之后就进入了类连接阶段,所谓连接,就是将已经读入内存的二进制数据存入到虚拟机的运行时环境中去。连接的第一步是验证,这一步主要是保证被加载的类有正确的内部结构,并且与其他的类协调一致。
类加载包含以下工作:

  • 类的结构检查:确保类文件遵从Java类文件的固定格式。
  • 语义检查:确保本身符合Java语法规定,比如接口没有具体方法实现。
  • 字节码验证:确保字节码可以被Java虚拟机安全地执行。
  • 二进制兼容验证:确保相互引用的类之间协调一致。

2.3 类的准备

在类的准备阶段,Java虚拟机为类的静态变量分配内存,并设置默认初始值。比如int类型的静态变量分配4字节空间,long类型分配8个字节,char类型分配2个字节,基础类型数据的空间大小自行百度。

2.4 类的解析

解析阶段,Java虚拟机会将二进制数据中的符号引用转化为直接引用。

2.5 类的初始化

这个阶段,类的静态变量会被赋予初始值,静态变量可以在声明处进行初始化,也可以在静态代码块中进行初始化。Java虚拟机初始化一个类需要遵循以下步骤:
1. 如果这个类还没有进行加载和连接,那么先进行加载连接;
2. 假如它有直接父类,那么应该先初始化其直接父类;
3. 假如类中存在初始化语句,那么依次执行初始化语句。

3 类加载器

Java虚拟机自带了一些加载器:

  • 根加载器(Bootstrap):它没有父加载器,他本身由C++编写,负责加载核心类库,比如java.lang.*包等等
  • 扩展类加载器(Extension):它的父加载器是根加载器。它负责加载jre/lib/dirs目录下的类库。
  • 系统加载器(System):它的父加载器是扩展类加载器,负责加载环境变量classpath中的类。

4 类的卸载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值