下面这个情况会出现内存泄露吗?update方法里面要不要手动的把Map的数据清除先?
public class CacheData { private Map<String, List<ChannelState>> ipChMap = null; private static CacheData instance = new CacheData(); private CacheData() {
ipChMap = getData();
} public static CacheData getInstance() {
return instance;
} static private Map<String, List<ChannelState>> getData() {
Map<String, List<ChannelState>> temp = new HashMap<String, List<ChannelState>>();
List<ChannelState> csList = new ChannelStateDao().queryAll();
for (ChannelState cs : csList) {
String ip = cs.getIp();
List<ChannelState> ls = new ArrayList<ChannelState>();
ls.add(cs);
if (temp.containsKey(ip)) {
temp.get(ip).add(cs);
} else {
temp.put(ip, ls);
}
}

return temp;
} public List<ChannelState> getChannelStateByIp(String ip) {
List<ChannelState> ls = ipChMap.get(ip);

return ls;
} public void update() {
ipChMap = getData();
// memory leakage???
}
}

解决方案 »

  1.   

    ipChMap在构造器中已经创建update方法不需要调用getData()方法
    可以直接使用ipChMap
      

  2.   


    update 方法是要去数据库更新一下数据,数据库的数据时不断变化的ipChMap就会直接赋给另外一个引用。。之前的引用还会存在内存中吗?(因为ipChMap里面还包含一个map,可能不会被释放)
      

  3.   

    昨天正好重新温习了一下“Thinking in java”中的垃圾回收,java提供的垃圾回收器会回收你程序中再也用不到的内存空间,也就是凡事你用new生成的东西都在垃圾回收器管理范围内,你的代码中并没有不是new出来的对象,因此现在只要关心的就是有没有什么对象是你被某些变量引用而一直没有释放而导致垃圾回收器无法回收,初步从你的代码来看应该不存在这个问题,ipChMap一旦指向了新的map后,原来的map应该就属于可以被回收范围了,在你的程序中没有别的什么变量再指向这个原来的map了。不知道我的理解对不对。
      

  4.   

    我的想法是ipChMap里面的小map
    虽然ipChMap已经没有引用,
    其中的小map还有引用,它会不会被回收呢?