Java是收集的垃圾

时间:2014-06-04 02:35:52

标签: java garbage-collection

Lets说我在实体类中有代码:

this.setCurrentState(new NormalState(this));

如果在正常状态类中,我将实体的状态切换为:

entity.setCurrentState(new HungryState(entity));

NormalState对象是垃圾收集事件,虽然它持有对仍处于活动状态的实体的引用或不会导致内存泄漏吗?

2 个答案:

答案 0 :(得分:1)

Java的垃圾收集器会删除所有对它们没有任何引用的对象。如果调用setCurrentState方法将存储的引用替换为NormalState的实例,并且在整个VM中没有对该对象的另一个引用,则将其标记为{{1因此,它将被收集。

答案 1 :(得分:1)

垃圾收集器删除所有未使用的对象;如果你的NormalState没有保存在变量中,也没有被代码使用,那么它将被垃圾收集。如果Entity是唯一包含对它的引用的对象,NormalState也将被垃圾收集。

例如,给定两个类A和B,其中A包含B,如下:

public class A {
    B inner = new B();

    public A(B in) {
        inner = in;
    }
}
在以下示例中,

myB将被垃圾收集(当我们收集A时):

public static void main(String[] args) {
    B myB;

    //setting a value with = returns the value
    //myB = new B() -> myB
    A firstObject = new A(myB = new B())

    //bad coding practice, but the fastest way to clear variables
    firstObject = null; 
    myB = null;
}

但是,以下内容不会垃圾收集myB,因为它仍然是一个引用:

public static void main(String[] args) {
    B myB;

    A firstObject = new A(myB = new B()) 
    A secondObject = new A(myB);

    //clear references. secondObject still has a reference to what was myB. 
    //the now unnamed B will not be collected until secondObject changes.
    firstObject = null; 
    myB = null;
}

注意:尝试命名对象非常烦人;只要它有一个变量,就很容易说myB,但即使你停止调用它myB,它仍然存在于计算机中。我不知道该怎么称呼它,因为我在myB时停止调用它myB = null;