我有一个开放的问题,因为很长一段时间与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是否已经发生并清除了我未使用过的物体?无论如何要检查这个?
答案 0 :(得分:1)
列表和地图与任何其他对象一样。一旦没有来自任何GC根目录的强引用路径(线程堆栈的静态变量),它们就有资格进入GC。
在这种情况下,只要returnData()
停止执行,就没有人引用代码中涉及的任何列表和地图,所以一切都符合GC的条件(除非隐藏在comment在某处存储引用。)
如果您真的坚持使用规范,则在第一个for循环之后,outerMap引用的Map将符合GC的条件。
顺便说一下,重新阅读你的问题,似乎你把对象的引用混淆了。innerMap
和outerMap
是对单个对象的两个引用:一个Map。对象是垃圾收集。不是参考。