ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

线上应用OOM分析与处理过程记录(excle到处产生内存溢出)

2022-04-07 18:03:23  阅读:226  来源: 互联网

标签:Ljava java OOM apache jdtask jd 处理过程 excle com


以下内容来自单位同事的技术分享,本人做了简单整理

报警内容

16:19:40至16:21:20【10.176.211.166(10073908643)(正式分组_银行卡)】,JVM监控堆内存使用率=99.77%[偏差5.02%],超过4次堆内存使用率>=95%

JVM监控

 

 

DUMP文件分析

http://172.31.222.23/10.176.211.166/10.176.211.166_jmap_20465_2022-04-07-16-25-45.txt.tar.gz

MAT工具打开dump文件,分析得出造成OOM的堆栈

message-executor:6
  at org.apache.poi.xssf.usermodel.XSSFRichTextString.utfDecode(Ljava/lang/String;)Ljava/lang/String; (XSSFRichTextString.java:480)
  at org.apache.poi.xssf.usermodel.XSSFRichTextString.getString()Ljava/lang/String; (XSSFRichTextString.java:297)
  at org.apache.poi.xssf.usermodel.XSSFCell.setCellValue(Lorg/apache/poi/ss/usermodel/RichTextString;)V (XSSFCell.java:327)
  at org.apache.poi.xssf.usermodel.XSSFCell.setCellValue(Ljava/lang/String;)V (XSSFCell.java:315)
  at com.jd.ql.monitor.receivable.utils.ExcelProducer.produceSheet(Ljava/lang/String;Ljava/util/List;Ljava/util/Map;)Lcom/jd/ql/monitor/receivable/utils/ExcelProducer; (ExcelProducer.java:113)
  at com.jd.ql.monitor.receivable.base.BasePush2JboxTask.process()V (BasePush2JboxTask.java:73)
  at com.jd.wl.data.jdtask.jdTask.JdTaskIterator.process(Lcom/jd/wl/data/jdtask/jdTask/JdTaskBaseTask;)V (JdTaskIterator.java:57)
  at com.jd.wl.data.jdtask.jdTask.JdTaskIterator.process(Lcom/jd/jdtask/executor/api/Task;)V (JdTaskIterator.java:16)
  at com.jd.jdtask.executor.job.JavaTaskProcessHandler.process(Ljava/nio/ByteBuffer;)V (TaskProcessHandler.scala:58)
  at com.jd.jdtask.dispatch.messages.TaskMessage.execute(Lcom/jd/jdtask/dispatch/QueryState;)Lcom/jd/jdtask/dispatch/Message$Response; (TaskMessage.java:78)
  at com.jd.jdtask.dispatch.Message$Dispatcher$1.call()Ljava/lang/Object; (Message.java:432)
  at java.util.concurrent.FutureTask.run()V (FutureTask.java:266)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V (ThreadPoolExecutor.java:1142)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run()V (ThreadPoolExecutor.java:617)
  at java.lang.Thread.run()V (Thread.java:745)

搜索logbook日志

 

 

 

 

只导出了11万数据就造成了OOM!!!(财务系统有导出1000万+数据的EXCEL),目测没有使用低内存的POI工具类

 

 

 

 

 

查看堆栈的代码,果然如此

 

 

google查询POI提供了HSSF、XSSF以及SXSSF三种方式操作Excel。他们的区别如下:

HSSF:是操作Excel97-2003版本,扩展名为.xls。

XSSF:是操作Excel2007版本开始,扩展名为.xlsx。

SXSSF:是在XSSF基础上,POI3.8版本开始提供的一种支持低内存占用的操作方式,扩展名为.xls

 

 

原文https://poi.apache.org/components/spreadsheet/

优化方案

  • 方案一:改用SXSSF方式导出excel
  • 方案二:引入阿里开源的EasyExcel框架

 

SXSSF使用demo https://poi.apache.org/components/spreadsheet/how-to.html#sxssf

 

easyExcel使用demo https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java

标签:Ljava,java,OOM,apache,jdtask,jd,处理过程,excle,com
来源: https://www.cnblogs.com/yanlai/p/tianwaiyanlai.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有