2014-01-16 69 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可節省大量內存。