Memory Leak

记录一次系统内存泄漏处理过程


系统问题和背景

  • 业务量猛增、系统涉及大量的文件读写、删除
  • 系统运行一段时间weblogic控制台打开很慢
  • weblogic出现stuck线程
  • weblogic jvm 监控显示内存使用达到90%一直不释放,手动gc也没效果

问题处理

  • 生成dump文件
    1
    jmap -dump:live,format=b,file=12077.bin 12077
  • 利用Eclipse MemoryAnalyzer分析dump文件   从上面图可以看到整体3.2G内存,其中3.1G都被一个"springScheduleExecutorFactoryBean-1"线程占用,这个就很可疑了。接着查看Leak Suspects如下所示:   我们基本定位 springScheduleExecutorFactoryBean-1(spring定时调度任务)存在内存泄漏,接着查看线程堆栈信息,如下所示:   定位到调度任务运行的类com.tz.controller.ArchivePro.,反编译相应jar如下所示,代码段大概是要删除并归档产生的Pdf文件,由于高并发下删除文件太慢,导致该代码出现内存泄漏问题。
  • 解决办法
    去掉该spring调度任务,改用Linux 定时任务删除文件
    1
    2
    5 0 * * * /home/weblogic/del.sh
    find /weblogic/ftp -maxdepth 1 -type d -name '*-*' -mtime +3 -exec rm -rf {} \;
  • 最终效果
    weblogic线程不再堵塞,通过监控weblogic jvm 可以看到内存已经可以自动回收,如下所示: