Java对象的完整生命周期

Java对象的完整生命周期

1).创建阶段(Created)
2).应用阶段(In Use)
3).不可见阶段(Invisible)
4).不可达阶段(Unreachable)
5).收集阶段(Collected)
6).终结阶段(Finalized)
7).对象空间重分配阶段(De-allocated)

创建阶段(Created)

通过以下的几个步骤来完成对象的创建过程
1).为对象分配存储空间;
2).开始构造对象;
3).从超类到子类对static成员进行初始化;
4).超类成员变量按顺序初始化,递归调用超类的构造方法;
5).子类成员变量按顺序初始化,子类构造方法调用;
一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段。

应用阶段(In Use)

理解为对象被一个或多个强引用。

不可见阶段(Invisible)

当一个对象处于不可见阶段时,说明程序本身不再持有该对象的不论什么强引用,尽管该这些引用仍然是存在着的。
可以理解为程序的运行已经超出了该对象的作用域了。

不可达阶段(Unreachable)

在虚拟机所管理的对象引用根集合中再也找不到直接或间接的强引用,这些对象通常是指所有线程栈中的临时变量,所有已装载的类的静态变量或者对本地代码接口(JNI)的引用。这些对象都是要被垃圾回收器回收的预备对象,但此时该对象并不能被垃圾回收器直接回收。其实所有垃圾回收算法所面临的问题是相同的——找出由分配器分配的,但是用户程序不可到达的内存块。

收集阶段(Collected)

当垃圾回收器发现该对象已经处于“不可达阶段”而且垃圾回收器已经对该对象的内存空间又一次分配做好准备时,则对象进入了“收集阶段”。假设该对象已经重写了finalize()方法,则会去运行该方法的终端操作。
非特殊不要重载finazlie()方法,原因有两点:
1). 会影响JVM的对象分配与回收速度,在分配该对象时,JVM须要在垃圾回收器上注冊该对象,以便在回收时可以运行该重载方法;在该方法的运行时须要消耗CPU时间且在运行完该方法后才会又一次运行回收操作,即至少须要垃圾回收器对该对象运行两次GC。
2).可能造成该对象的再次“复活”,在finalize()方法中,假设有其他的强引用再次持有该对象,则会导致对象的状态由“收集阶段”又又一次变为“应用阶段”。这个已经破坏了Java对象的生命周期进程,且“复活”的对象不利用代码管理。

终结阶段(Finalized)

当对象运行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。

对象空间重分配阶段(De-allocated)

垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间又一次分配阶段”。

参考:
https://blog.csdn.net/qq_25005909/article/details/78981512
https://www.cnblogs.com/mengfanrong/p/4007456.html

java类生命周期

一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段

jvm(java虚拟机)中的几个比较重要的内存区域

方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区域,叫做方法区。
常量池:常量池是方法区的一部分,主要用来存放常量和类中的符号引用等信息。 堆区:用于存放类的对象实例。
栈区:也叫java虚拟机栈,是由一个一个的栈帧组成的后进先出的栈式结构,栈桢中存放方法运行时产生的局部变量、方法出口等信息。当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果方法中调用了其他方法,则继续在栈顶创建新的栈桢。

初始化

如果一个类被直接引用,就会触发类的初始化。在java中,直接引用的情况有:
通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法。 通过反射方式执行以上三种行为。
初始化子类的时候,会触发父类的初始化。 作为程序入口直接运行时(也就是直接调用main方法)。
除了以上四种情况,其他使用类的方式叫做被动引用,而被动引用不会触发类的初始化。

卸载

在类使用完之后,如果满足下面的情况,类就会被卸载:
该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收
该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法

你可能感兴趣的:(java,基础)