java.lang.OutOfMemoryError

我读一个40M的文件,就出现这个错。(TOMCAT)
高手怎么解决啊,急急!!!
A Servlet Exception Has Occurred
Exception Report:
javax.servlet.ServletException
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:457)
at org.apache.jsp._0002fRISe_0002ffeature_jsp._jspService(_0002fRISe_0002ffeature_jsp.java:2346)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:201)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:381)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:458)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:215)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2314)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1000)
at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1093)
at java.lang.Thread.run(Thread.java:536)

Root Cause:
java.lang.OutOfMemoryError

超出内存了。

是啊,
那有什么好的解决方法?

修改WEB服务器或应用服务器的虚拟机参数
java -Xms128M -Xmx128M ......

要是tomcat4的
修改/bin/setclasspath.bat文件


set _RUNJAVA="%JAVA_HOME%\bin\java -Xms128M -Xmx128M"

我的TOMCAT版本是:
Starting service Tomcat-Standalone
Apache Tomcat/4.0-b8-dev
Starting service Tomcat-Apache
Apache Tomcat/4.0-b8-dev
怎么没有那个文件?
这样改了是不是客户端访问的多还会出现java.lang.OutOfMemoryError错误?
谢谢!

对,如果有并发,并且读不同的大文件,最好作一个排队机,用异步的方式一个一个处理,同时对每一各大文件在处理前用File类的API检查一下他的大小,太大了也会出问题。
如果是同一个文件,读一次作cache就行了。

如果没有文件setclasspath.bat,
在catalina.bat文件中找到:doStart标签
在java命令后加上-Xms128M -Xmx128M就行了

加上还是出错啊?

你真的需要将 40M 的数据全录入内存吗?
如果没有必要,就应该改改算法

1.Quick and Dirty Solution,排除是否需要更多的内存
有可能,你的程序里面1个字节的数据占用超过3倍的控件,40M*4=160兆,用了128M的参数还是不行,改用256M或者更高
2.像iceant所说的那样,修改算法,降低粒度,要知道,这个页面如果是几个个人访问的话,如前所以叙述,你的配置不是要以G来算了嘛?
总不能一只叫support的人加内存参数的值呢?