2015-09-06 9 views
1

我有一個懸而未決的問題,因爲很長一段時間關於hashmap GC。檢查谷歌和其他博客,似乎沒有找到答案。何時是哈希圖或列表<Hashmap> GC符合條件?

這裏是它,

說我有以下兩種方法之一返回HashMap和另一個列表如下,

public void returnData(){ 
    Map<String,String> outerMap = getMap(); 
    for(elements from getMap){ 
     //DO SOMETHING 
    } 
    List<Map<String,Object> outerList = getListMap(); 
    for(elements from getListMap){ 
     //DO SOMETHING 
    } 
} 
private Map<String,String> getMap(){ 
    Map<String,String> innerMap = new HashMap<String,String>(); 
    for(i){ 
     innerMap.put("one"+i,"test"+i); 
    } 
    return innerMap; 
} 
private List<Map<String,Object>> getListMap(){ 
    List<Map<String,Object>> innerList = new ArrayList<HashMap<String,Object>>; 
    for(5 times){ 
     Map<String,String> map = new HashMap<String,String>(); 
     map.put("two"+i,new Object()); 
     innerList.add(map); 
    } 
    return innerList; 
} 

每上面的代碼,請讓我知道,
1.什麼時候會innerMap和innerList有資格獲得GC?
2.外部映射和外部列表什麼時候符合GC的條件?
3.將使innerMap和innerList爲null使其符合GC的條件?
4.應該如何使outerMap和outerList符合GC的條件?
5.最後,如何測量GC是否發生並清除了未使用的物體?無論如何檢查這個?

回答

1

列表和地圖就像任何其他對象一樣。只要沒有任何GC根(線程堆棧的靜態變量)的強引用路徑,它們就有資格使用GC。

在這種情況下,只要returnData()停止執行,任何人都沒有引用導致代碼中涉及的任何列表和映射的引用,因此一切都符合GC的條件(除非隱藏在註釋後面的代碼存儲了一個參考某處)。

如果你真的堅持規範,那麼在第一個for循環之後,由outerMap引用的Map就有資格使用GC。

順便說一句,重新讀你的問題,似乎你混淆了對象與對象的引用。 innerMapouterMap是對單個對象的兩個引用:一個Map。對象是垃圾收集。未提及。

+0

謝謝,評論裏面的代碼實際上使用GSON API將地圖/列表轉換爲JSON對象。然後json對象返回到UI部分。也就是說,數據返回到UI的那一刻,這將有資格獲得GC?請確認! – Faz

+1

*只要returnData()停止執行,沒有人有引用導致代碼中涉及的任何列表和地圖,因此所有內容都符合GC *。 –