tomcat 服务器下内存溢出 Java heap space 错误信息如下:
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: javax.servlet.ServletException: java.lang.OutOfMemoryError: Java heap space
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
root cause 
javax.servlet.ServletException: java.lang.OutOfMemoryError: Java heap space
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:850)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
org.apache.jsp.index_jsp._jspService(index_jsp.java:1337)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
root cause 
java.lang.OutOfMemoryError: Java heap space
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.
--------------------------------------------------------------------------------
Apache Tomcat/6.0.14以前放在Linux服务器下面没出现过这个问题;是不是winows服务器或者Tomcat有什么要配置的啊?
谢谢!~

解决方案 »

  1.   

    <Tomcat home>/conf/server.xml有一个参数:
    Maximum heap size把这个参数设置大一点
      

  2.   

    不好意思 我在conf下面没有找到有 Maximum heap size
    这个参数的文件啊?
      

  3.   

    是在../bin/目录下的catalina.sh文件
      

  4.   

    堆内存溢出,这需要找原因的,并不是把 JVM 堆内存加大就能解决得了的。原因可能出在这些上面:1:查询时 SELECT 返回大量的数据,导致 JVM 堆内存耗尽;
    2:我看你使用了 OpenSessionInViewFilter,这是个效率低下的做法,会导致数据库连接从请求直到响应完成都开着。OutOfMemoryError 必须找出原因,否则把堆内存加到很大也是无济于事。Windows 中加大 Tomcat 内存的方法:找到 tomcat 的 bin 目录中的 catalina.bat,在开始处加上一行:set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx512m
      

  5.   

    在 Linux 中在 catalina.sh 中加上JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx512m"-Xms 设置 JVM 的初始堆内存数
    -Xmx 设置 JVM 的最大堆内存数
      

  6.   

    谢谢您的建议,OpenSessionInViewFilter,这是个效率低下的做法  有什么可以取代这个的么?推荐一下 谢谢!
      

  7.   

     tomcat 的 bin 目录中 没有你说的catalina.bat文件呢
      

  8.   

    1.堆溢出的原因在于当前系统中new的对象太多了,系统中new的对象是存储在堆里的,像一些基本类型,如:int、float、double、char、long等类型是存储在栈中的,大部分产生堆溢出有2中可能
      1)当前系统new对象太多,内存设置太小
      2)系统有死循环,或者内存泄露等,产生出了太多了new的对象
    2.可以google下如何解决,如果是linux环境下,利用kill -3 命令把当前的一些线程信息保存下来,再利用工具分析下。windows下时楼主可以google下,发散下对自己很有帮助。
      

  9.   

    再请教一下 这个和 Hibernate缓存有关系吗?
      

  10.   

    OpenSessionInViewFilter 可以避免使用,在代码中用 LEFT JOIN FETCH 等将需要的数据全部查出,而不是跑到页面上再去查。我不会 Hibernate,我想 Hibernate 就算有缓存也不至于导致 OutOfMemoryError 吧?