生成环境发发生系统卡顿,通过命令检查当时系统内容的使用状况
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的内容发现这个文档中的内容不多,但是里面的工时特别复杂,还是用到了其他的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的公式带来的系统卡断
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)