1、查看catalina相关日志,确定关键字相关行号
文件:catalina.out
命令1:cat -n catalina.out |grep -a 'OutOfMemoryError'
与内存溢出相关的如上,每一个行号其实都对应到具体时间点。可以发现,这个范围相符合:
633851 Apr 11, 2024 9:59:02 AM -- 4月11日
633879 Apr 11, 2024 10:33:20 AM -- 4月11日
2、分析起止行号的日志
命令2:cat -n catalina.out |tail -n +633500|head -n 400
633838 java.lang.OutOfMemoryError: Java heap space
633839 Dumping heap to /opt/web/oms.xxx.cn/java/java_pid17812.hprof ...
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/web/oms.xxx.cn/java
3、jhat,分析获取的.hprof文件
jhat /Users/quanxin/Downloads/java_pid17812.hprof
jhat -J-mx10g /Users/quanxin/Downloads/java_pid17812.hprof
https://www.php.cn/faq/522972.html
4、关键字检索:Xobj$AttrXobj
内存溢出 org.apache.xmlbeans.impl.store.Xobj$AttrXobj
POI直接加载Excel文件导致的线上OOM问题_apache poi读取大的excle哪里容易产生oom-CSDN博客
5、安装mat 定位业务日志
参考5步,链接。使用MemoryAnalyzer加载dump文件, 查看Thread Stack线程栈信息
工具不行,太老了。eclipse下的插件。
安装一直失败,也许mac的原因。还需要对应jdk版本,太麻烦。
6、换个工具试试,JProfiler
如何使用,请自行百度,摸索半小时。
随便找几个看看,全部都定位到。
// at com.xxx.web.oms.controllers.detection.insurance.InsuranceController.add() (line: 1624)
用户操作记录
跟内存溢出的时间,基本吻合。
633851 Apr 11, 2024 9:59:02 AM -- 4月11日
633879 Apr 11, 2024 10:33:20 AM --
7、业务代码与结论
WFHttpServletRequestWrapper rw = (WFHttpServletRequestWrapper) BeatContext.current().getRequest();
String filename = rw.getFile("fileName").getOriginalFilename();
Workbook wb = FileUtil.getWorkbook(rw, "fileName");
结果:用户导入一个excel,大约40MB,复制了很多空行导致。