2011-02-10 49 views
2

我是新來的Java,並給予修復錯誤的任務,問題如下。如果你給的建議/想法,這是什麼問題,這將是非常偉大的,我怎麼能解決這個問題:Java根本原因java.lang.OutOfMemoryError錯誤

HTTP Status 500 - 

-------------------------------------------------------------------------------- 

type Exception report 

message 

description The server encountered an internal error() that prevented it from fulfilling this request. 

exception 

org.apache.jasper.JasperException 
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:453) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368) 


root cause 

javax.servlet.ServletException 
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858) 
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791) 
    org.apache.jsp.CustMaint.Jsp.ProfProfileDetails_jsp._jspService(ProfProfileDetails_jsp.java:4016) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368) 


root cause 

java.lang.OutOfMemoryError 


note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs. 


-------------------------------------------------------------------------------- 

Apache Tomcat/5.5.17 
+1

歡迎來到Stackoverflow!對於您沒有注意到的情況,只要您在消息編輯器中,就可以在消息編輯器下方的預覽區域中驗證消息格式。請在將來再多加註意:) – BalusC 2011-02-10 15:42:31

+0

我們需要查看根本原因(來自tomcat日誌)的堆棧跟蹤,以便能夠進行評論。 – trojanfoe 2011-02-10 15:43:49

+0

請參閱:http://stackoverflow.com/questions/37335/how-to-deal-with-java-lang-outofmemoryerror-java-heap-space-error-64mb-heap-s – 2011-02-10 15:44:05

回答

7

這裏是Tomcat的傢伙不得不說:

內存不足可

  • 一個servlet試圖加載幾個 GB的文件到內存必將 殺服務器:通過 幾個原因被拋出。在我們的 程序中,這些類型的錯誤 必須被視爲一個簡單的錯誤。

  • 爲了補償數據 你的servlet試圖加載,你 增加堆大小,以便有 沒有空間來創建堆棧大小 的需要是 創建的線程。每個 線程所需的內存將根據操作系統而有所不同,但默認爲 高達2M,某些操作系統的 (如Debian Sarge)不可還原 和-Xss參數。 1規則 Thumb,在32位Web應用程序中使用不超過1G的堆 空間。

  • 深遞歸算法也可能導致內存不足問題 。在 這種情況下,唯一修復程序是 增加線程堆棧大小 (-Xss),或者重構算法 以減少每次調用的深度或本地數據大小 。

  • 使用,許多圖書館 有很多依賴, 或服務器維護大量的 的webapps可能exhauste的JVM的PermGen 空間web應用程序。此空間是VM 存儲類和方法數據的位置。 在這些情況下,修復程序將增加此尺寸的 。太陽VM具有標誌 -XX:MaxPermSize,允許設置其大小(默認值是64M)

  • 上課硬引用可以防止回收分配給他們的 內存 垃圾收集時 ClassLoader被丟棄。這將在JSP重新編譯時發生 ,並且將重新加載 webapps。如果這些操作 在具有這些 類型問題的web應用程序中很常見,那麼將會是時間問題 ,直到PermGen空間變爲 已滿且引發Out Of Memory爲止。

來源:Tomcat Wiki: OutOfMemory

0

這種問題是不容易的,僅僅基於堆棧跟蹤下來釘。至少可以歸結爲在應用程序中存在內存泄漏(代碼在內存中保留(不必要地)太長的對象),或者服務器根本沒有足夠的內存爲了能夠運行你的web應用程序(只是因爲它被設計成需要很多內存的方式)。

要檢測並修復內存泄漏,請使用Java分析器。如果你沒有任何內存泄漏,即內存使用量是穩定的,但代碼真的需要那麼多的內存,那麼只需給服務器更多的內存來處理。然而,剖析器仍然有用,可以發現Web應用程序中的內存空洞並相應地優化代碼。

如果您使用的是Eclipse,請使用TPTP profiler或者如果您使用的是Netbeans,請使用內置的VisualVM profiler。或者當您使用獨立VisualVM時,請檢查this blog如何使用它監控Tomcat。

0

使用Java堆分析工具(JHAT)和Eclipse MAT http://www.eclipse.org/mat/來分析JVM內部正在進行的操作。什麼是吃多少記憶。查看配置文件,然後查看導致該問題的代碼。你可以使用JConsole,它很容易設置它。你可以看到'活'的東西。 TPTP也是一個不錯的選擇,不幸的是,我覺得很難配置。

2

那麼......誰真的引起了內存不足的錯誤?

如果你吃了8片比薩餅,而且你已經飽了,它是導致胃出錯的最後一片嗎?

相關問題