Java - 实例变量或方法局部变量在内存中停留的时间更长

时间:2014-04-14 10:20:38

标签: java performance garbage-collection

我有一个愚蠢的问题需要澄清。见下面的代码。 Ex 1 ,我创建了一个MySecondClass的实例,并在每个方法中使用它。我每次都不创建一个实例,无论什么时候都需要它。

但是在 Ex 2 中,我在每个方法中创建了MySecondClass的实例。

我想知道哪种实现在内存消耗(garbage collection)和良好性能方面表现良好?

Ex 1

 public class MyClass {

   private MySecondClass var1 = new MySecondClass ();


   public void doSomthing(){
      var1 .DoMultiply();
   }


   public void doAnotherThing(){
      var1 .DoCount();
   }


} 

Ex 2

  public class MyClass {




     public void doSomthing(){

        MySecondClass mySec = new MySecondClass ();
        mySec.DoMultiply();
     }


     public void doAnotherThing(){

        MySecondClass mySec = new MySecondClass ();
        mySec.DoCount();

     }


 } 

更新

确定完成代码我添加了调用者类。

public class Caller {

  public static void main(String arg[]){

    MyClass myClass = new MyClass ();  // first instance
    myClass.doSomthing();

    MyClass myClass2 = new MyClass ();   // second instance
    myClass2.doAnotherThing();

  }

}

2 个答案:

答案 0 :(得分:0)

两者都具有相同的内存消耗(O(1)),但后者为垃圾回收器提供了更多的工作,因为在每个方法运行MySecondClass后都有资格进行垃圾回收。

如果您的方法功能正常,并且您无法弄清var1MySecondClass)的状态,那么第一个选项就有意义。

所以基本上没有更多的信息,很难分辨哪一个。

答案 1 :(得分:0)

通常,它们的行为会有所不同,在每次方法调用后(在Ex 2中)对象都符合GC 的条件,但这并不意味着它们会在立即离开方法后被清除。实际上,当GC实际运行时,内存将被回收,并且当年轻一代或老一代的内存存在压力时会发生这种情况。

如果你的对象创建很便宜并且这个对象足够小,那么很可能你甚至不会觉得垃圾收集发生了(因为它会在年轻一代中发生)。除非您确定这是应用程序中的瓶颈,否则将对象移动为实例字段。

个人信息

选择in-method方法,因为这会增加线程的安全性,而且你永远不知道将来你的类将被用在哪里。