【问题标题】:Java is this Garbage CollectedJava就是这个垃圾收集
【发布时间】:2014-07-24 13:12:35
【问题描述】:

假设我在实体类中有代码:

this.setCurrentState(new NormalState(this));

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

entity.setCurrentState(new HungryState(entity));

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

【问题讨论】:

  • 至少在我看来,您在 似乎 不同的对象上调用 setCurrentState 的方式可能会造成混淆......
  • 是的,最终。大概只有一个currentState 引用变量,当新状态的引用值被存放在那里时,旧状态变得无法访问。
  • @user3580294 第一段代码来自的实体类在构造函数中设置,第二段用于普通状态类,它们都处理同一个实体。
  • 关于 Java 垃圾收集的重要知识是您不需要了解它的任何内容。除了在一些相当罕见的情况下,这一切都得到了神奇的照顾。

标签: java garbage-collection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    例如,给定两个类,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 = null; 时,我不再称呼它为myB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2011-11-07
      • 2011-01-26
      • 2012-06-12
      • 1970-01-01
      相关资源
      最近更新 更多