何时Hashmap或List <hashmap> GC符合条件?

时间:2015-09-06 21:32:40

标签: java performance collections garbage-collection

我有一个开放的问题,因为很长一段时间与hashmap GC有关。检查谷歌和其他博客,似乎没有找到答案。

就是这样,

假设我有两个方法,一个返回Hashmap,另一个List返回如下,

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. outerMap和outerList何时符合GC的条件?
3.将innerMap和innerList设为null是否符合GC的条件? 4.应该做些什么来使outerMap和outerList符合GC的条件?
5.最后,如何测量GC是否已经发生并清除了我未使用过的物体?无论如何要检查这个?

1 个答案:

答案 0 :(得分:1)

列表和地图与任何其他对象一样。一旦没有来自任何GC根目录的强引用路径(线程堆栈的静态变量),它们就有资格进入GC。

在这种情况下,只要returnData()停止执行,就没有人引用代码中涉及的任何列表和地图,所以一切都符合GC的条件(除非隐藏在comment在某处存储引用。)

如果您真的坚持使用规范,则在第一个for循环之后,outerMap引用的Map将符合GC的条件。

顺便说一下,重新阅读你的问题,似乎你把对象的引用混淆了。 innerMapouterMap是对单个对象的两个引用:一个Map。对象是垃圾收集。不是参考。