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虚拟机本身。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值