【问题标题】:java.lang.OutOfMemoryError: Java heap space on JSP Pagesjava.lang.OutOfMemoryError:JSP 页面上的 Java 堆空间
【发布时间】:2011-08-30 15:39:18
【问题描述】:

我在 Spring 框架应用程序上遇到内存不足错误。我禁用了一些过滤器(如安全过滤器)。但是现在错误出现在 JSP 页面上。我的 JSP 页面很重,并且使用 Tile Framework。

不幸的是,我的主机只提供了 32 MB 的堆空间,我无法增加。

我在布局页面中添加了几行:

final long  MEGABYTE = 1024L * 1024L;

// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();
out.println("Total Memory (MB): "+(heapSize / MEGABYTE ));

// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();
out.println("<br/>Heap Max Size (MB): "+(heapMaxSize / MEGABYTE ));

// Get amount of free memory within the heap in bytes. This size will increase
// after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory();
out.println("<br/>Heap Free Size (MB): "+(heapFreeSize / MEGABYTE ));

以上在输出(HTML 页面)处打印以下输出

Total Memory (MB): 29 
Heap Max Size (MB): 29 
Heap Free Size (MB): 3 

这是堆栈跟踪:

javax.servlet.jsp.JspException: ServletException in '/jsp/fragments/account/newAccount.jsp': java.lang.OutOfMemoryError: Java heap space
at org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:921)
at org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:460)
at org.apache.jsp.jsp.common.tiles.layout_jsp._jspx_meth_tiles_005finsert_005f3(layout_jsp.java:818)
at org.apache.jsp.jsp.common.tiles.layout_jsp._jspService(layout_jsp.java:428)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:662)

【问题讨论】:

  • 您的问题是什么?我想我们需要一些代码来帮助你。
  • 我的问题是,我想通过使用 JSP 的一些最佳实践来减少内存空间或类似的东西,即使在 32 MB 的空间上也能摆脱 Out of Heapspace 错误。

标签: java jsp servlets


【解决方案1】:

我只提供了 32 MB 的堆空间,我无法增加。

对不起,故事到此结束。你有两个选择:

  • 重写视图以提高内存效率。也许您需要退回到普通的 JSP/Servlet,而不需要任何额外的框架,每个框架当然都需要自己的内存共享。

  • 给服务器更多内存。升级您现有的主机帐户或迁移到其他主机。

【讨论】:

    【解决方案2】:

    分析您的应用程序可能是一种选择,它可以让您深入了解导致 OutOfMemory 错误的实际原因,以及是否真的可以在不增加物理内存的情况下优化代码。

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多