【问题标题】:When is Hashmap or List<Hashmap> GC eligible?Hashmap 或 List<Hashmap> GC 何时符合条件?
【发布时间】:2015-09-06 21:32:39
【问题描述】:

长期以来,我有一个关于 hashmap GC 的悬而未决的问题。查了google等博客,好像没有找到答案。

就是这样,

假设我有两种方法,一种返回 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 并清除了我未使用的对象?无论如何要检查这个?

【问题讨论】:

    标签: java performance collections garbage-collection


    【解决方案1】:

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

    在这种情况下,一旦returnData() 停止执行,没有人可以引用指向代码中涉及的任何列表和映射,因此所有内容都符合 GC 条件(当然,隐藏在注释存储后面的代码除外某处的参考)。

    如果您真的遵守规范,则由 outerMap 引用的 Map 在第一个 for 循环之后立即符合 GC 条件。

    顺便说一句,重新阅读您的问题,您似乎将对象的引用与对象混淆了。 innerMap 和 outerMap 是对单个对象的两个引用:一个 Map。对象被垃圾收集。不是参考。

    【讨论】:

    • 谢谢,cmets 中的代码实际上使用 GSON API 将地图/列表转换为 JSON 对象。然后将json对象返回给UI部分。也就是说,当数据返回 UI 时,这将符合 GC 条件吗?请确认!
    • 一旦 returnData() 停止执行,没有人可以引用指向代码中涉及的任何列表和映射,因此所有内容都符合 GC 条件。跨度>
    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多