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

Rav*_*mar 2 java out-of-memory

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

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
Run Code Online (Sandbox Code Playgroud)

Sea*_*oyd 7

以下是Tomcat人员所说的话:

内存不足可能由多种原因引发:

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

  • 为了补偿servlet尝试加载的数据,可以增加堆大小,以便没有空间为需要创建的线程创建堆栈大小.每个线程所需的内存因操作系统而异,但默认情况下可能高达2M,而某些操作系统(如Debian Sarge)则无法通过-Xss参数进行缩减.1经验法则,在32位Web应用程序中使用不超过1G的堆空间.

  • 深度递归算法也可能导致Out Of Memory问题.在这种情况下,唯一的修复是增加线程堆栈大小(-Xss),或重构算法以减少深度,或每次调用的本地数据大小.

  • 使用大量具有许多依赖关系的库的Web应用程序,或维护大量Web应用程序的服务器可能会耗尽JVM PermGen空间.此空间是VM存储类和方法数据的位置.在这些情况下,修复是增加此大小.Sun VM具有-XX:MaxPermSize允许设置其大小的标志 (默认值为64M)

  • 对类的硬引用可以防止垃圾收集器在ClassLoader丢弃时回收为它们分配的内存 .这将在JSP重新编译时发生,并且webapps会重新加载.如果这些操作在具有这些类型问题的webapp中很常见,那么在PermGen空间变满并且抛出Out Of Memory之前,这将是一个时间问题.

来源: Tomcat Wiki:OutOfMemory