Excel上传导致系统卡顿的原因分析

Excel上传导致系统卡顿的原因分析,第1张

Excel上传导致系统卡顿的原因分析 问题定位

生成环境发发生系统卡顿,通过命令检查当时系统内容的使用状况

jmap -histo PID >PID.log

故障发生时类实例数量如下

 num     #instances         #bytes  class name
----------------------------------------------
   1:       2446448      234859008  org.apache.xmlbeans.impl.store.Xobj$AttrXobj
   2:       1555034      149283264  org.apache.xmlbeans.impl.store.Xobj$ElementXobj
   3:       1881947      121925800  [C
   4:        123293       61938104  [B
   5:       1839322       44143728  java.lang.String
   6:       1030771       41230840  java.util.TreeMap$Entry
   7:        321542       33274520  [I
   8:       1006611       32211552  org.apache.poi.xssf.usermodel.XSSFCell
   9:       1006611       32211552  org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.STCellRefImpl
  10:       1006611       24158664  org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTCellImpl
  11:        151564        9700096  java.util.regex.Matcher
  12:        139174        7715240  [Ljava.lang.Object;
  13:         62803        5526664  java.lang.reflect.Method
  14:        132113        5284520  java.util.linkedHashMap$Entry
  15:         31784        3718552  [Ljava.util.HashMap$Node;
  16:         71635        3438480  java.util.StringTokenizer
  17:         60477        3386712  java.util.linkedHashMap
  18:         94773        3269848  [Ljava.lang.String;
  19:         93373        2987936  java.util.HashMap$Node
  20:         72627        2324064  java.util.linkedHashMap$linkedKeyIterator
  21:         20047        2221984  java.lang.Class
  22:         52611        1683552  java.util.concurrent.ConcurrentHashMap$Node
  23:         18026        1442080  java.lang.reflect.Constructor
  24:         59280        1422720  java.util.ArrayList
  25:         24444        1173312  java.util.HashMap
  26:         16290        1172880  java.lang.reflect.Field
  27:         35055        1121760  java.lang.ref.WeakReference
  28:         23008        1104384  java.util.TreeMap
  29:         25101        1004040  java.lang.ref.SoftReference
  30:         23289         931560  org.apache.xmlbeans.impl.values.XmlUnsignedIntImpl

通过类信息得知影响系统卡顿的原因是excel的使用导致的

问题文件定位

通过文件目录获取到故障发生之前的excel文件找到文件

找到文件之后,在本地执行测试

public class ExcelTest {
	
	public static void main(String[] args) throws InvalidFormatException, IOException, InterruptedException {
		Workbook workbook = WorkbookFactory.create(new File("E:21909_好莱客导入(刘安)4.1新版xlsx.xlsx"));
		Sheet sheetAt = workbook.getSheetAt(0);
		int lastRowNum = sheetAt.getLastRowNum();
		System.out.println("excel的数据共有行数为:"+lastRowNum);
		Thread.sleep(300*1000);
		
		System.out.println("执行完毕");
	}

}

使用VisualVm分析本地测试的内存使用情况


经过检查发现,类的实例化数量与本地测试一模一样,因此确认就是这个excel导致的前端卡段

Excel分析

分析excel的内容发现这个文档中的内容不多,但是里面的工时特别复杂,还是用到了其他的sheet,因此怀疑是excel公式导致的

我把这个excel中的内容复制到一个新的excel中之保留值,继续测试,代码如下

public class ExcelTest {
	
	public static void main(String[] args) throws InvalidFormatException, IOException, InterruptedException {
		//Workbook workbook = WorkbookFactory.create(new File("E:21909_好莱客导入(刘安)4.1新版xlsx.xlsx"));
		Workbook workbook = WorkbookFactory.create(new File("E:21.xlsx"));
		Sheet sheetAt = workbook.getSheetAt(0);
		int lastRowNum = sheetAt.getLastRowNum();
		System.out.println("excel的数据共有行数为:"+lastRowNum);
		Thread.sleep(300*1000);
		
		System.out.println("执行完毕");
	}

}

这次的结果与之前的大不相同

这次org.apache.xmlbeans.impl.store.Xobj 到了5位数了
验证了是由于excel的复杂公式导致系统卡断

总结

excel的上次由于使用了公式可能会导致读取的内容特别大,如果在短时间内没有使用完,gc没有回收到就会驻留在内存中,其他的情况可能暂时无法得到相应
应该避免使用excel的公式带来的系统卡断

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5563177.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存