2014-01-16 39 views
0

我对现有应用程序的代码进行了一些修改。虽然测试我得到异常创建:java.lang.OutOfMemoryError。但是错误在一段时间内只发生一次。下面是其中所述错误发生创建的异常: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

我认为,背后的原因是内存泄漏。在完成所有变量之后,确保所有变量都有弱点或幻影参考,并且必须注意不要强烈引用任何死的物体。 –

+0

你需要给JVM更多的内存来处理,否则你可能会在某处发生内存泄漏。 – Bart

回答

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

你永远不会将您的标记生成器指针向前,所以当这一条件得到满足,这是无限添加的第一个标记到列表中。在你的代码尝试

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

请注意,从StringTokenizer API页面:“StringTokenizer是一个遗留类,由于兼容性原因而保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人都使用String或java.util的拆分方法。正则表达式包而不是“ – Matt

+0

非常感谢马特的决议。 – user1643087

0

如果您的内存不足并且无法增加堆大小,那么您只能尝试使用较少的内存。

将某种类型的探查器附加到您的应用程序中(大多数IDE都内置了一个探查器),并查看内存在哪里以及您可以做些什么来减少内存或消除潜在的资源泄漏。

它也值得运行findbugs对您的项目,看看如果发现任何东西。再次,它可以作为大多数IDE的插件。

0

发行是无限的,而loop.change你的代码

m_mobileq2List.add(m_tokenizer2.nextToken()); 

也使空use.Go为StringBuffer的,StringBuilder的,而不是字符串后,您的所有字符串时possible.If你正在使用任何输入/输出流在使用后关闭它们,并使它们为空。使大对象为null可节省大量内存。