我在spring框架应用程序上出现内存不足错误。我禁用了一些过滤器(如安全过滤器)。但现在错误发生在JSP Pages上。我的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)
答案 0 :(得分:4)
我只提供了32 MB的堆空间,我无法增加它。。
抱歉,但那是故事的结局。您有两个选择:
重写您的视图以提高内存效率。也许你需要回归普通的JSP / Servlet,而不需要任何额外的框架,每个框架都需要自己的内存共享。
为服务器提供更多内存。升级现有的主机帐户或迁移到其他主机。
答案 1 :(得分:2)
分析您的应用程序可能是一个选项,可以让您深入了解实际导致OutOfMemory错误的原因以及是否真的可以在不增加物理内存的情况下优化代码。