未初始化的对象与新对象

时间:2015-08-04 10:40:14

标签: java object hashmap initialization out-of-memory

这些代码段如何彼此不同:

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;
}

3 个答案:

答案 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。 第二步后,它将指向另一个地址,旧的将被垃圾收集。