2011-03-12 69 views
1
simpleClass sc = new simpleClass(); 
sc.getObject(); 
... 

simpleClass.java编码标准

class simpleClass { 

    static int st = 0; 

    public Integer getObject() { 
     Integer i = 10; 
     Integer j = 10; 
     Integer result = 10; 

     try { 
      result = getSum(i, j); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } finally { 
      i = null; 
     } 
     return result; 
    } 

    public Integer getSum(Integer a, Integer b) { 
     return a + b; 
    } 
} 

请解释一下其中的变量/对象是资格垃圾当

哪些时间停留在记忆中?

如何处理符合垃圾内存但仍在内存中的对象?

直到记忆中,才是生命和印象。

我的朋友和我已经为此辩论,仍然继续这么多不同的陈述。

回答

1

为什么不读一些关于Java垃圾回收而不是争论的东西:)?例如http://www.ibm.com/developerworks/java/library/j-jtp11253/http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html

有定义有没有所谓的根集,其基本上由静态引用的(你在你的代码有没有,因为static int不是引用)或堆栈,它是当地居民(Integer i/Integer j变量/ Integer result)以及执行方法期间的参数(整数a /整数b)。因此,在执行getObject()期间,由i,j ans结果引用的对象将成为根集的一部分,并且不符合gc(以及可能被这些间接引用的任何对象)。然而,一旦getObject()完成,我和j的对象可以被删除。如果将结果对象分配给另一个局部变量,那么结果对象将保留在根集中,即如果您执行类似Object o = aSimpleClass.getObject()的操作。

1

让我们来看看。

class simpleClass { 
    static int st = 0; 

st变量根本不使用 - 这是故意的吗?

public Integer getObject(){ 
      Interger i = 10; 
      Interger j = 10; 
      Interger result = 10; 

我想这些应该是Integer。所以,在这里您创建了3个变量,并将它们全部分配给相同的对象,即Integer.valueOf(10)的结果。该方法保证为相同的输入返回相同的对象,至少对于小值。我认为它通常将这些值存储在Integer类的静态数组中。

  try{  
       result = getSum(i, j); 

在这里,你调用getSum方法 - 这(如果校正的)返回另一个对象,它是相同Integer.valueOf(20)

  }catch(Exception ex){ 
       ex.printStackTrace(); 

如果有异常(它不是,如果你不覆盖在子类总和法),你要在这里捕捉并打印异常对象,然后把它扔掉。

因此,一个对象(及其包含的stacktrace对象)可用于垃圾收集。

  } finally{ 
       i = null; 

这里你分配nulli变量。如果i包含一个仅通过i引用的对象,它现在可用于垃圾回收,但由于它也在j变量中(并且据推测也在Integer中的某个静态变量中),所以它不是。

  } 
      return result; 

我们最终的方法 - 所以现在它的所有局部变量(ijresult)的结束。 20对象(在result)被返回,因此现在是调用方法的责任。 10对象(在j)不再被该线程引用(至少不在我们看到的代码中),所以它可以被释放 - 但正如所说的,通常Integer类保留对该对象的引用,所以没有垃圾收集这里。

} 
    public Interger getSum(Interger a, Interger b){ 
     retrun a + b; 
    } 

请在发布代码时,至少在编译器之前运行它。它是Integerreturn

} 
+0

thanx好友,但完成/执行方法的对象后有资格进行垃圾收集itSelf所以不需要做i = null;和j = null; – 2011-03-12 11:08:01

+0

在这个简单的方法中,不需要'i = null'和'j = null',否。对于运行时间很长的方法来说,它可能是有意义的,但只有在存在内存或性能问题时才考虑优化,然后进行测量。 – 2011-03-12 11:14:11