解决Tomcat应用的内存溢出问题
维护一个老系统,发现有java.lang.OutOfMemoryError: Java heap space的情况,内存溢出,以下是大致的解决过程:
1.安装JProfiler,并配置成监控本地的tomcat
2.修改catalina.bat,添加参数: set JAVA_OPTS= -Xms768m -Xmx1024m -verbose:gc -Xloggc:../logs/gclog.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError %JAVA_OPTS%
3.使用JProfiler在Tomcat的bin目录下创建的启动脚本startup_jprofiler.bat重启tomcat
4.运行JProfiler观察内存状况,未发现问题
5.第二天突然发现Tomcat再次出现内存溢出,Tomcat的bin目录下自动生成了java_pid107932.hprof文件,将此文件下载到本地,以便分析。
6.下载Memory Analyzer工具,然后打开该hprof文件进行分析,发现是SmartUpload的问题:com.jspsmart.upload.Files占用内存1G多。
7.用Apache的上传组件替换掉smartupload,目前没有发现问题
?
附上Memory Analyzer分析的图片:
?
Leak Suspects显示,有一个东西占了1007.9M的内存:
?
?
?点击底部的Details链接,发现是com.jspsmart.upload.Files占用内存最多:
?
?
1 楼 魔力猫咪 2009-11-28 没看到解决方案呀。只看到找到了问题 2 楼 taupo 2009-11-28 同意楼上,不过找到了问题所在,基本上完成了一半了 3 楼 javatestoracle 2009-11-29 上传文件,应该结合硬盘空间来使用,否则很容易出现outofmemory,我认为增加JVM的内存空间虽然是个办法,但不是最好的solution。 4 楼 lixjluck 2009-11-29 是使用内存模式上传文件?我猜想应该是,而且对上传文件做完处理后,没有及时删除文件。加上这个,应该就没问题了。 5 楼 treblesoftware 2009-11-29 写IO的时候CLOSE没关? 6 楼 linzy410 2009-11-30 在tomcat还在运行的时候监控内存,可以看出是哪个类、哪个线程内存溢出了,不用搞这么麻烦 7 楼 makemyownlife 2009-11-30 我再使用ibatis 处理 大字段的时候上传 ,服务器使用tomcat,上传文件小的情况下不出问题,但是文件大了,报的也是这个异常,不知道各位有什么好的解决方法? 8 楼 Xsen 2009-11-30 魔力猫咪 写道没看到解决方案呀。只看到找到了问题
呵呵,解决方案就是替换掉smartupload,我使用的是使用Apache的上传组件 9 楼 Xsen 2009-11-30 linzy410 写道在tomcat还在运行的时候监控内存,可以看出是哪个类、哪个线程内存溢出了,不用搞这么麻烦
是的,一开始我也是用JProfiler监控,但当时估计是没有遇到用户上传文件,没有发现问题。第二天发现时tomcat已经down掉了,于是利用输出的文件查看了一下。。。 10 楼 chengkun 2010-06-22 3.使用JProfiler在Tomcat的bin目录下创建的启动脚本startup_jprofiler.bat重启tomcat
4.运行JProfiler观察内存状况,未发现问题
5.第二天突然发现Tomcat再次出现内存溢出,Tomcat的bin目录下自动生成了java_pid107932.hprof文件,将此文件下载到本地,以便分析。
请问楼主, 通过第三步 操作后 ,如果 内存溢出,就会生成 .hprof 文件么?
我是直接 通过jprofiler 配置后启动,进行监控的。最后 jprofiler 只会报错: disconnect. 并没有生成文件。
现在的做法是: 我按照第三点:启动了startup_jprofiler.bat ,然后启动 tomcat ,看看能不能生成 .hprof 文件。
11 楼 Xsen 2010-06-29 那是因为你忽略了第二步的设置。 12 楼 it2010 2010-06-29 楼主可以在Tomcat里面配置永久内存可以解决此问题!通常都在比较大型的网站会出现此问题,小的网站基本不太会碰到。