类的生命周期

类的生命周期


一:类生命周期概况

JVM为Java程序提供运行时环境(runtime environment),管理类和对象的生命周期是JVM的重要工作之一。

类的生命周期从类被加载、连接、初始化开始,到类被卸载结束。

只有当类在生命周期中时,才能被使用,比如调用类的静态方法或者创建类的实例。

这里写图片描述


二:类的加载、连接和初始化

1:加载
  1. 将类对应.class文件中的二进制数据读到内存中,把它存放在运行时数据区的方法区内;

  2. 在堆取创建一个Class实例,此实例

    a) 描述了方法区内的数据结构

    b) 提供了访问类在方法区内数据结构的接口,如下图所示:

    这里写图片描述

    可以简单的理解为:类加载的产品是一个Class类的实例。

2:链接

连接指将已经读入内存的二进制数据合并到虚拟机的运行时环境中去。包括验证、准备、解析三个步骤。

Ⅰ. 验证

被加载的.class文件并不一定是java编辑器生成的(比如黑客可以制作自定义结构的.class文件),所以jvm才需要对.class文件进行验证,保证被加载的类有正确的内部结构,并且与其他类协调一致。如果jvm检查到错误,那么抛出Error对象。以此来提高程序的健壮性。

Ⅱ. 准备

准备阶段为类的静态变量分配内存并且赋默认值。

Ⅲ. 解析

解析阶段,jvm把类的二进制数据中的符号引用替换为直接引用。比如,dog.run(); 这行代码,run这个方法是被dog这个符号(变量名)引用,解析过程将dog这个符号替换为一个指针地址(直接引用)。

3:初始化

(1) 静态变量赋值(父类) —> 静态代码块(父类) —> 静态变量赋值(子类) —> 静态代码块(子类) 。

(2) 注意:在初始化阶段,只会为类变量(静态全局变量)进行初始化工作,并且当类变量声明为final

类型且初始化语句采用了常量表达式方式进行初始化赋值(能被编译器计算出来),那么, 也不会对其进行

初始化,它将会直接被编译器计算并保存在常量池中,并且对这些变量的使用也将直接将其变量值嵌入到字

节码中。


三:卸载

当类被加载、连接、初始化后,生命周期就开始了,java程序可以正常使用该类(实例化,调用方法等), 当

描述此类的Class对象不可触及(触不可及为对象生命周期中的概念),Class对象将结束生命周期,此类方

法区内的数据将被卸载,此类的生命周期结束。


四:反射中Class.forName()和ClassLoader.loadClass()的区别

(1) Class.forName(className)方法,内部实际调用的方Class.forName(className,true,classloader);

第2个boolean参数表示类是否需要初始化, Class.forName(className)默认是需要初始化。一旦初始

化,就会触发目标对象的 static块代码执行,static变量也会被再次初始化。

(2) ClassLoader.loadClass(className)方法,内部实际调用的方法是 ClassLoader.loadClass(className,false);第2个

boolean参数,表示目标对象是否进行链接,false表示不进行链接,由上面介绍可以,不进行链接意味着不进行包括初始化等一些

列步骤,那么静态块和静态对象就不会得到执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值