Java类生命周期

问题:JVM是怎么找到Class二进制字节码?找到后,又是如何加载到JVM内存的呢?加载的过程是什么?JAVA对象以及类又是什么时候销亡掉了呢?
回答:理解类生命周期,类加载机制,追本溯源,答案自现。
类生命周期:包括五个阶段 加载-连接-初始化-使用-卸载如下图:
在这里插入图片描述

  1. 加载

编写一个java类,经过编译器编译后生成.class文件,JAVA虚拟机就可以识别。java类生命周期,就是class文件从加载到销往的过程。加载,即JVM读取二进制文件(文件系统、网络、其他地方)找到类的信息(类或者接口名称、方法名、字段名等),将其加载到方法区,同时在堆区创建该类的类对象,作为方法区中这个类的信息入口。不同的虚拟机加载类的时机不同,需要时加载(hotspot)和预先加载。

  1. 连接

连接一般是加载和初始化阶段交叉进行,有分3个阶段如下:
(1)验证:验证读取的二进制内容是否符合JAVA语言规范。有没有属性和行为重复,继承是否合理,避免恶意代码执行,总之就是为了让JVM能够安全执行。
(2)准备:为static修饰的成员变量分配内存,以及设置默认值(区别与初始化阶段中的初始值
默认初始值如下:
i.八种基本数据类型默认的初始值是0
ii.引用类型默认的初始值是null
iii.有static final修饰的会直接赋值,例如:static final int x=5;则默认就是5.
(3)解析:这阶段的任务就是将方法区中常量池中的符号引用转换为直接引用。

  1. 初始化

初始化阶段就是static修饰的成员变量和代码块赋值的过程。静态代码块和static成员变量执行顺序是依据代码顺序,谁在前,谁先执行。父子关系中的执行顺序是先执行父类后执行子类。(该过程,同一类加载器加载后多次使用不会在执行,是在使用之前)。

【强制初始化】以下5种情况会被强制初始化(执行类的静态代码块,为这个类的静态属性赋值)
(1)T是一个类,T类型的实例被创建;
(2)T是一个类,该类的静态方法被调用;(main方法执行之前,会执行main方法所在类中的静态代码块);
(3)T中声明的一个静态字段被赋值;
(4)T中静态变量被使用,而且该静态变量不是常量字段;

public static String a="a";

(5)T中常量字段,但该场所是对象类型不是基础类型;

public static final String STATE=new String("初始化");
//区别
public static final String STATE="初始化";//编译器已经被赋值
  1. 使用
    类的使用过程分三步:

(1)对象实例化:调用类的构造函数(父子关系会先调用父类构造函数)。
(2)垃圾收集:对象不在被引用,堆内存会标记垃圾,静待垃圾回收器的回收。
(3)对象终结:对象被GC回收,对象生命走到尽头(类对象可还没有走到尽头

  1. 卸载

一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。
当该类的实例对象被GC回收;同时该类的加载器实例也已经被GC,该类则被卸载。

加载器和Class对象:在类加载器的内部实现中,用一个Java集合来存放所加载类的引用。另一方面,一个Class对象总是会引用它的类加载器。调用Class对象的getClassLoader()方法,就能获得它的类加载器。由此可见,Class实例和加载它的加载器之间为双向关联关系。

类、类的Class对象、类的实例对象:一个类的实例总是引用代表这个类的Class对象。在Object类中定义了getClass()方法,这个方法返回代表对象所属类的Class对象的引用。此外,所有的Java类都有一个静态属性class,它引用代表这个类的Class对象。

由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。Java虚拟机自带的类加载器包括根类加载器、扩展类加载器和系统类加载器。Java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用它们所加载的类的Class对象,因此这些Class对象始终是可触及的。

由用户自定义的类加载器加载的类是可以被卸载的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值