这些代码段如何彼此不同:
Snippet 1: HashMap map1= abc() ;
Snippet 2: HashMap map2= new HashMap();
map2 = abc();
我的应用程序中出现OutOfMemoryError。可能是因为我的代码中Snippet 1的实现导致了这个错误的原因吗?
编辑:添加了abc()
的实现public HashMap abc(){
HashMap rMap = null;
StringBuffer sQuery = new StringBuffer("");
sQuery.append(" SELECT DISTINCT ABC ,DEF, ");
sQuery.append(" XYZ, ID, NAME ");
sQuery.append(" FROM TABLE1");
Query query = new Query( sQuery.toString());
List rList = query.executeSelect();
if (rList != null && rList.size() > 0) {
Iterator listIter = rList.iterator();
Map map = null;
rMap = new HashMap();
while (listIter.hasNext()) {
map = (HashMap) listIter.next();
String key = map.get("ABC") + "%"+ map.get("DEF")+"%"+map.get("XYZ");
if( rMap.containsKey(key)){
LinkedHashMap sMap = (LinkedHashMap) rMap.get(key);
sMap.put(map.get("ID"), map.get("NAME"));
rMap.put(key, sMap);
}else{
LinkedHashMap sMap = new LinkedHashMap();
sMap.put(map.get("ID"), map.get("NAME"));
rMap.put(key, sMap);
}
}
}
return rMap;
}
答案 0 :(得分:1)
在Snippet 2
中,您将创建一个额外的实例,该实例有资格在下一个语句中进行垃圾回收。所以基本上它们是相同的,它不应该导致内存泄漏。
尝试运行探查器来检查内存映射或增加堆大小。
答案 1 :(得分:0)
您的问题似乎是代码的另一部分。
发生OutOfMemoryError
时尝试设置自动堆转储。见Using HeapDumpOnOutOfMemoryError parameter for heap dump for JBoss
然后,触发运行代码的异常。
最后一件事是使用Eclipse Memory Analyzer https://eclipse.org/mat/等工具分析转储,并在大量小对象实例中查找大对象。 有很多关于如何分析内存转储的教程: http://www.vogella.com/tutorials/EclipseMemoryAnalyzer/article.html
答案 2 :(得分:0)
基本上在开头的代码段2中,您只需初始化map2。 第二步后,它将指向另一个地址,旧的将被垃圾收集。