论坛首页 Java企业应用论坛

解决Tomcat应用的内存溢出问题

浏览 12777 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-27   最后修改:2009-11-30

维护一个老系统,发现有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的内存:

内存状态图1

 

 

 点击底部的Details链接,发现是com.jspsmart.upload.Files占用内存最多:

内存状态图2

 

 

  • 大小: 72.4 KB
  • 大小: 138.2 KB
   发表时间:2009-11-28  
没看到解决方案呀。只看到找到了问题
0 请登录后投票
   发表时间:2009-11-28  
同意楼上,不过找到了问题所在,基本上完成了一半了
0 请登录后投票
   发表时间:2009-11-29  
上传文件,应该结合硬盘空间来使用,否则很容易出现outofmemory,我认为增加JVM的内存空间虽然是个办法,但不是最好的solution。
0 请登录后投票
   发表时间:2009-11-29  
是使用内存模式上传文件?
我猜想应该是,而且对上传文件做完处理后,没有及时删除文件。加上这个,应该就没问题了。
0 请登录后投票
   发表时间:2009-11-29  
写IO的时候CLOSE没关?
0 请登录后投票
   发表时间:2009-11-30  
在tomcat还在运行的时候监控内存,可以看出是哪个类、哪个线程内存溢出了,不用搞这么麻烦
0 请登录后投票
   发表时间:2009-11-30   最后修改:2009-11-30
我再使用ibatis 处理 大字段的时候上传 ,服务器使用tomcat,上传文件小的情况下不出问题,但是文件大了,报的也是这个异常,不知道各位有什么好的解决方法?
0 请登录后投票
   发表时间:2009-11-30  
魔力猫咪 写道
没看到解决方案呀。只看到找到了问题


呵呵,解决方案就是替换掉smartupload,我使用的是使用Apache的上传组件
0 请登录后投票
   发表时间:2009-11-30   最后修改:2009-11-30
linzy410 写道
在tomcat还在运行的时候监控内存,可以看出是哪个类、哪个线程内存溢出了,不用搞这么麻烦


是的,一开始我也是用JProfiler监控,但当时估计是没有遇到用户上传文件,没有发现问题。第二天发现时tomcat已经down掉了,于是利用输出的文件查看了一下。。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics