对象的生命周期
在我们一般的编码过程中,对象的创建一般是这样的:
//第1步:Duck myduck 声明引用变量
//第2步:new Duck() 创建Duck对象
//第3步:= 连接对象Duck与引用myduck
Duck myduck = new Duck();
我们都知道java中有GC(垃圾回收机制),当一个对象不再使用时,它所占用的空间将被回收,并重新分配使用。于是,我们不禁会问:一个对象它能存活多久呢?什么情况下,它才可能被GC回收?
对象的生命周期完全取决于引用,只要关联的引用还活着,那么对象也将继续活在堆(heap)上。如果引用都“消亡”了,那么对象也将跟着“陪葬”。(此处并不是说,对象马上就会GC回收,此时只能说是它符合垃圾收集器的回收条件,至于何时被回收,我们不用太关心。一般在内存不足,GC会主动去回收部分或全部的可回收对象。)
引用的生命周期又分两种情况:
1. 如果引用是局部变量,那么它存活在声明该变量的方法里。一旦该方法调用结束(从方法调用栈弹出),该引用变量就会消亡。
2. 如果引用是实例变量,那么它的生命周期与持有它的对象一样,只要对象还活着,该引用也就会存活下去。
既然了解了对象的生命周期及回收过程,我们在平时的编码过程中,要注意对象用完了,就要抛弃。如果保持着放,垃圾回收器也无能为力。下面是常见的3种释放对象引用的方法:
1.引用永久性的离开它的范围:
void go(){
//z会在方法结束时消失
Life z = new Life();
}
2.引用被赋值到其他对象上:
Life z = new Life();
z = new Life();
3.直接将引用设置为null
Life z = new Life();
z = null;