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

Java根本原因Java.lang.OutOfMemoryError错误,java,out-of-memory,Java,Out Of Memory,我是Java新手,负责修复一个bug,问题如下。如果你能提出建议/想法,那就太好了。这个问题是什么?我该如何解决这个问题呢 HTTP Status 500 - -------------------------------------------------------------------------------- type Exception report message description The server encountered an internal error

我是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

以下是Tomcat的家伙们要说的:

内存不足可能是由 有几个原因:

  • 尝试加载多个 GB文件进入内存肯定会 杀死服务器。这类错误 在我们的系统中,必须将其视为一个简单的bug 节目

  • 对数据进行补偿 您的servlet尝试加载,您需要 增加堆大小,以便 没有空间创建堆栈大小 对于需要修改的线程 创建。每个处理器所需的内存 线程将因操作系统而异,但可以如下所示 默认情况下高达2M,在某些操作系统中 (像Debian Sarge)是不可还原的 使用
    -Xss
    参数。1规则 拇指,堆使用不超过1G 32位web应用程序中的空间

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

  • 一个使用大量 对于具有许多依赖关系的库, 或者是一台维护大量数据的服务器 webapps可能会耗尽jvmpermgen 空间这个空间是虚拟机所在的位置 存储类和方法数据。 在这些情况下,解决办法是增加 这个尺寸。Sun VM具有该标志
    -XX:MaxPermSize
    允许设置其大小(默认值为64M)

  • 对类的硬引用可以防止 垃圾收集器从回收 当发生错误时为它们分配的内存
    ClassLoader
    被丢弃。这将 在JSP重新编译时发生,并且 webapps重新加载。如果这些操作 在具有这些功能的Web应用程序中很常见 各种各样的问题,这将是一个问题 直到永磁空间 已满,将抛出内存不足


来源:

仅根据stacktrace就很难确定此类问题。这至少可以归结为应用程序内存泄漏(代码在内存中保留了(不必要的)太多的对象(不必要的)很长时间),或者服务器没有足够的内存来运行你的webapp(仅仅是因为它的设计需要很多内存)

要检测和修复内存泄漏,请使用Java探查器。如果没有任何内存泄漏,即内存使用是稳定的,但代码确实需要那么多内存,那么只需给服务器更多的内存即可。不过,探查器在发现webapp中的内存漏洞并相应地优化代码方面仍然很有用


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

使用Java堆分析工具()和Eclipse MAT分析JVM内部的情况。什么是吃多少记忆。查看配置文件,然后查看导致该问题的代码

你也可以使用,它非常容易设置。你可以看到“活”的东西。TPTP也是一个很好的选择,不幸的是,我发现很难配置。。。到底是谁导致了内存不足错误


如果你吃了8片比萨饼,而你已经吃饱了,是不是最后一片比萨饼导致了胃痛?

欢迎来到Stackoverflow!对于您没有注意到的情况,只要您在消息编辑器中,就可以在消息编辑器下方的预览区域中验证消息格式。请在将来对此多加注意:)我们需要查看根本原因的堆栈跟踪(来自tomcat日志),以便能够进行评论。请参阅:另请参阅:
深度递归算法也可能导致内存不足问题。在这种情况下,唯一的修复方法是增加线程堆栈大小(-Xss),或重构算法以减少深度,或每次调用的本地数据大小。
导致StackOverflow错误的两个都是VirtualMachineError,但都超出了点,使用直接缓冲区可能会导致OOM,同样好。@bestsss:or
OutOfMemoryError
当堆栈尚未溢出时,但内存是由于每个递归步骤中的昂贵作业造成的。@BalusC,-请再次阅读:“-Xss”堆栈大小,是否需要使用堆?在这种情况下,任何减少深度的想法,任何建议都是完全不合适的。将递归转换为迭代将花费更多的堆!Tomcat Wiki完全错了。哈哈!我真的不能投票。但如果有一个“喜欢”按钮,我肯定会点击这个答案。