Java根本原因java.lang.OutOfMemoryError错误

时间:2011-02-10 15:40:27

标签: java out-of-memory

我是Java的新手并负责修复错误,问题如下。如果您提出建议/想法是什么问题以及如何解决这个问题,那将是非常好的。:

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

4 个答案:

答案 0 :(得分:7)

以下是Tomcat人员所说的话:

  

可以抛出内存不足   几个原因:

     
      
  • 试图加载几个的servlet   GBytes文件肯定会进入内存   杀死服务器。这些错误   必须被视为我们的一个简单的错误   程序

  •   
  • 补偿数据   你的servlet试图加载你   增加堆大小以便那里   没有空间来创建堆栈大小   对于需要的线程   创建。每个人需要的内存   线程因操作系统而异,但可以是   默认情况下在某些操作系统中高达2M   (像Debian Sarge一样)不可简化   使用-Xss参数。 1规则   Thumb,堆使用不超过1G   32位Web应用程序中的空间。

  •   
  • 深度递归算法也可以   导致内存不足的问题。在   这种情况下,唯一的修复方法是   增加线程堆栈大小   (-Xss),或重构算法   减少深度,或本地数据   每次通话的大小。

  •   
  • 使用批量的网络应用程序   有许多依赖的库,   或维护很多的服务器   webapps可能会耗尽JVM PermGen   空间。这个空间是VM的所在   存储类和方法数据。   在这些情况下,修复是增加   这个大小。 Sun VM有旗帜   -XX:MaxPermSize允许设置其大小(默认值为64M)

  •   
  • 对类的硬引用可以阻止   回收垃圾收集器   a时为他们分配的内存   ClassLoader被丢弃。这将   发生在JSP重新编译上,和   webapps重新加载。如果这些操作   在具有这些的webapp中很常见   各种问题,这将是一个问题   时间,直到PermGen空间得到   完全和内存不足。

  •   

来源: Tomcat Wiki: OutOfMemory

答案 1 :(得分:2)

嗯......谁真的造成内存不足错误?

如果你吃了8片披萨并且你已经吃饱了,那么它是导致胃出错的最后一片吗?

答案 2 :(得分:0)

基于堆栈跟踪,这种问题并不容易确定。它至少归结为你的应用程序中存在内存泄漏(代码在(不必要地)内存中保留(不必要的)太多对象,或者服务器根本没有足够的内存为了能够运行你的webapp(只是因为它的设计方式需要很多内存)。

要检测并修复内存泄漏,请使用Java分析器。如果您没有任何内存泄漏,即内存使用情况稳定但代码确实需要那么多内存,那么只需给服务器更多内存即可使用。但是,分析器仍然可用于发现webapp中的内存漏洞并相应地优化代码。

如果您正在使用Eclipse,请使用TPTP profiler,或者如果您使用的是Netbeans,请使用内置VisualVM profiler。或者当您使用独立的VisualVM时,请检查this blog如何使用它监视Tomcat。

答案 3 :(得分:0)

将Java堆分析工具(JHAT)与Eclipse MAT http://www.eclipse.org/mat/一起使用来分析JVM内部的情况。什么是吃多少记忆。查看配置文件,然后查看导致该配置文件的代码。

您也可以使用JConsole,设置它很容易。你可以看到“活着”的东西。 TPTP也是一个不错的选择,不幸的是,我觉得很难配置。