在同一个变量中多次实例化类

时间:2017-07-15 06:00:12

标签: java null garbage-collection

我想知道如果我做了类似的事情,垃圾收集会发生什么:

public class Ball {
    private int x;
    private int y;
    private int radius;
    // Constructors, getters and setters
}

public class BallClient {

   public static void main(String[] args) {
      Ball myball = new Ball();
      while(true) {
         myball = new Ball();
      }
   }

}

忽略无限循环。 Ball在同一个变量上的多个实例是否会在垃圾收集上产生开销?可以这样做还是编程不好?

我在一个应用程序的整个持续时间内调用的方法中看到了这个以呈现图像,如果这不是一个坏习惯,我就无法回答。

2 个答案:

答案 0 :(得分:4)

  

同一个变量上Ball的多个实例是否会在垃圾收集上产生开销?

GC必须收集这些物品,是的。但这是它的工作,并且它在收集短期物品方面非常有效(优化)。

  

可以这样做还是编程不好?

没关系。当然,根据实际用例,实际代码,类的实际设计,可以更好地重用同一个球。但是,创建短命对象本身并不是一种坏习惯。事实上,这种情况一直都在发生。

您是否使用相同的变量并没有太大变化。但是,为了可读性和可维护性(不是性能,这很少是您应该担心的主要问题),变量的范围应该尽可能地窄,并且它应该在循环内而不是在外部声明。

答案 1 :(得分:2)

一旦您的应用程序不再具有对对象的任何引用,它就有资格进行垃圾回收。大多数收藏家使用具有堆的年轻和旧区域的世代布局。由于你的物体很小,它们将被分配到伊甸园空间(年轻一代通常分为伊甸园和幸存者空间)。这非常有效,因为它使用指针碰撞来分配空间(大约六条指令,这比调用malloc更有效)。当Eden空间指针到达可用空间的末尾时,将发生次要GC。只有活动对象从Eden复制到幸存者空间,因此您创建对象的方式对收集器的负载非常小。实际上,在小型GC中收集的对象是免费收集的。

作为一种最佳实践,我会说是的,创造非常短暂的物体是好的。你想要避免的是创建的对象只能活到足够长的时间才能升级为旧版本然后变成垃圾。通常增加年轻一代的规模可以缓解这一点。在这种情况下,没有必要。