# 附件加水印导致OA服务内存溢出

# 背景

近期频繁出现OA服务无法登录,已将OA节点数2——>3,堆内存32G——>64G,问题出现时间仅能缓解至1天。

# 问题分析

  • 1、首先,检查JVM堆内存老年代使用率(建议可部署dump工具,查看问题发生时的dump日志,或出问题时查看系统监控页面)

1768542973506.png

截图可以明显判断jvm内存老年代异常,已经触发了多次full gc,可能内存溢出。

  • 2、检查OA目录下是否存在内存溢出文件(ApacheJetspeed/bin下是否有.hprof文件,信创环境在中间件目录下)

未生成内存溢出文件

  • 3、当前老年代使用率95%,沟通客户是否可以通过jmap手动导出内存dump文件(执行过程会影响oa正常使用,需客户确认后谨慎执行)
cd jdk/bin
./jmap -dump:format=b,file=[内存dump文件名].bin [OA服务java进程PID]
  • 4、通过mat工具分析导出的内存dump文件

官网下载MAT时,找jdk8的包:MemoryAnalyzer-1.8.1.20180910-linux.gtk.x86_64.zip (opens new window)

解压工具后,先修改堆内存大小(大于等于OA最大堆内存)配置文件:mat/MemoryAnalyzer.ini

工具使用需要先安装JDK,且配置环境变量

# 分析命令,/path/to/heapdump.hprof是jmap导出的dump文件的绝对路径
cd mat
./ParseHeapDump.sh /path/to/heapdump.hprof org.eclipse.mat.api:suspects
  • 5、查看分析结果

分析完成后会在当前目录生成一个 xxxxx_Leak_Suspects.zip 的压缩文件

解压,并通过浏览器打开 index.html 文件,可以看到一个类似下图的页面

1768544227163.png

圆饼图中a、b、c、d四部分都是可能存在内存泄漏的问题,依次点击下方详情中的 See stacktrace,查看详细堆栈

1768544395549.png

这个堆栈中,我们查找seeyon相关的地方,可以看到是在下载附件添加水印的功能上

at com.seeyon.apps.ext.waterMarkPlugin.util.AddExcelWaterMark.putWaterRemarkToExcel
at com.seeyon.apps.ext.waterMarkPlugin.util.AddExcelWaterMark.setExcelWaterMark
at com.seeyon.apps.ext.waterMarkPlugin.util.WaterMarkUtil.downloadFile
at com.seeyon.apps.ext.waterMarkPlugin.util.WaterMarkUtil.addWaterMark
at com.seeyon.apps.ext.waterMarkPlugin.event.WaterMarkEvent.onFileDownload
编撰人:wangyxyf