我在现有应用程序的代码中进行了一些修改。在测试时我创建了异常: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的增加超出了范围。
答案 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可以节省大量内存。