2011-03-12 66 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