创建了异常:java.lang.OutOfMemoryError

时间:2014-01-16 11:09:05

标签: java arraylist jvm out-of-memory

我在现有应用程序的代码中进行了一些修改。在测试时我创建了异常:java.lang.OutOfMemoryError。但错误只会偶尔发生一次。下面是发生错误的代码片段

}else if(subject.equals("Mobile")){
        to=(String)hashMap.get("M_MOBILETOMAIL");
        m_mobileoptionvalue=(String)parameters.get("m_mobileoptionvalue");
        m_mobileq1value=(String)parameters.get("m_mobileq1value");
        StringTokenizer m_tokenizer1 = new StringTokenizer(m_mobileq1value,"|");
        while (m_tokenizer1.hasMoreTokens()){
            m_mobileq1List.add(m_tokenizer1.nextToken());
         }
        m_mobileq2value=(String)parameters.get("m_mobileq2value");
        StringTokenizer m_tokenizer2 = new StringTokenizer(m_mobileq2value,"|");
        while (m_tokenizer2.hasMoreTokens()){
        m_mobileq2List.add(m_mobileq2value);
         }
        m_mobileq3value=(String)parameters.get("m_mobileq3value");
        StringTokenizer m_tokenizer3 = new StringTokenizer(m_mobileq3value,"|");
        while (m_tokenizer3.hasMoreTokens()){
        m_mobileq3List.add(m_mobileq3value);
        }
        m_mobileq4value=(String)parameters.get("m_mobileq4value");
        m_mobileq4=(String)parameters.get("m_mobileq4");

    }

我正在接受的错误是

m_mobileq2List.add(m_mobileq2value);

还附加JVM日志----

exception created in one of the service methods of the servlet MailSend in application interact_assorted_intapp7. Exception created : java.lang.OutOfMemoryError
        at java.util.ArrayList.newElementArray(ArrayList.java:94)
        at java.util.ArrayList.growAtEnd(ArrayList.java:375)
        at java.util.ArrayList.add(ArrayList.java:158)
        at com.international.servlets.MailSend.doPost(MailSend.java:473)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)

我经历了一些相关的帖子,但没有得到任何正确的结果。而且HeapSize的增加超出了范围。

3 个答案:

答案 0 :(得分:2)

while (m_tokenizer2.hasMoreTokens()){
    m_mobileq2List.add(m_mobileq2value);
}

您永远不会向前移动标记器指针,因此当满足此条件时,它会无限地将第一个标记添加到列表中。尝试

while (m_tokenizer2.hasMoreTokens()){
    m_mobileq2List.add(m_tokenizer2.nextToken());
 }

答案 1 :(得分:0)

如果内存不足而无法增加堆大小,那么你所能做的只是尝试使用更少的内存。

将某种类型的探查器附加到您的应用程序(大多数IDE都有一个内置的)并查看内存的去向以及您可以采取哪些措施来减少它,或者删除您可能遇到的任何潜在资源泄漏。

同样值得对你的项目运行findbugs并查看是否找到了任何东西。它再次作为大多数IDE的插件提供。

答案 2 :(得分:0)

代码中的问题是无限的,而循环。将代码更改为

 m_mobileq2List.add(m_tokenizer2.nextToken());

使用后也将所有字符串设为null。尽可能使用StringBuffer,StringBuilder而不是字符串。如果您使用任何输入/输出流,请在使用后关闭它们并使它们为null。使用大对象null可以节省大量内存。