Java对象生命周期分为以下几个阶段:

java中对象实例 java对象的生命周期_java中对象实例

ObjectLifeCycle

我们一般在开发中往往只涉及对象生命周期的两三个阶段,比如Created,InUse和Finalized,导致我们写的程序效率低下。因此要提高代码效率、避免bug、减少内存泄漏,一定要掌握对象生命周期所有阶段的知识。

1.创建(created)

创建阶段为对象分配内存,调用构造函数,初始化属性。当对象创建后会存储在JVM的heap堆中等待使用。

publicDoggetDog(){
Dogdog=newDog();//creationofObjectDog
returndog;
}

2.使用(InUse)

有强引用指向的对象被称为处于使用阶段,下面代码中dog强引用指向Dog类的对象,此时对象处于使用状态(inuse)

Dogdog=newDog();//HeredogisstrongreferencetoDogObject

一个对象可以有多个强引用,GC不会回收处于使用状的对象。created阶段和inuse阶段的区别在于对象创建后如果没有指向它的引用就不会进入inuse阶段,这种情况下对象会直接进入Unreachable状态

//CreationofDogObjects
Dogdog=newDog();
Dogdog2=newDog();
dog=null;//ObjectrefereedbydogdirectlygoestoUnreachablestate

3.不可见(Invisible)

强引用对象超出其作用域后就变为不可见的,不可见阶段的对象会引起内存冗余,影响系统性能。

publicvoidexecute(){
try{
Objectobj=newObject();
}catch(Exceptione){
e.printStackTrace();
while(true){

………….

上面的代码执行到while无限循环,在while循环之前的对象引用obj已经超出访问范围可以被GC回收,但实际上它和while循环处于同一栈帧中。如果这个obj指向的对象体积很大或者while循环前有许多这种相同的引用,很可能会引起OutOfMemoryException异常。

解决方案:使用完对象引用后要显示地将引用置为null

4.不可达(Unreachable)

当不再有引用指向对象时对象进入不可达阶段,这类对象会被GC回收,但何时回收是由GC本身决定的。

Dogdog=newDog();//line1

dog=null;//line2

上述代码中第一行的dog指向的对象在第2行变为不可达,GC不仅能检测到这种简单的不可达对象,也能检测到复杂的循环引用,并及时回收它们。

5.回收(collected):

当不可达阶段(unreachable)的对象被GC识别后会进入回收阶段(collected),这是重新分配前的阶段。如果对象定义了finalize方法,要将释放内存的操作放在finalize方法之前。

6.终结(finalized)

当对象的finalized方法执行后仍处于unreachable状态,就进入最终状态,等待GC执行垃圾回收。

7.对象空间再分配(deallocated)

Deallocated状态是垃圾回收的最后一步,如果经过上面所有的阶段对象仍为unreachable,就可以进入deallocation阶段了。当然何时回收、再分配及相关算法取决于JVM虚拟机本身。