jconsole的小应用

应用场景

当excel导出时发生了oom,优化代码后想查看下优化前和优化后导出excel时占用的内存差异,这个时候可以借助jconsole工具来进行查看。

调试步骤

测试类示例代码

模拟50万条数据调用优化前和优化后excel工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Test
public void testExport() throws Exception {
long startTime = System.currentTimeMillis();
ExcelData<AiCallVO> data = new ExcelData<>();
List<String> titles = new ArrayList<>();
titles.add("通话记录ID");
titles.add("客户姓名");
titles.add("客户手机");
titles.add("意向等级");
titles.add("通话时长");
titles.add("呼叫时间");
titles.add("通话状态");
titles.add("所属任务");
List<AiCallVO> volist = new ArrayList<>();
for (int i = 0; i < 500000; i++) {
AiCallVO aiCallVO = new AiCallVO();
aiCallVO.setCallDuration(i);
aiCallVO.setCallStartTime("2019-03-07");
aiCallVO.setIntentionLevel("A");
aiCallVO.setMobile("13758270856");
aiCallVO.setName("测试");
aiCallVO.setStatus("已接通");
aiCallVO.setTaskName("测试任务" + i);
volist.add(aiCallVO);
}
data.setRows(volist);
data.setTitles(titles);
data.setName("通话记录");
ExportExcel4BigDataUtil.exportExcel(data); #优化后工具类
//ExportExcelUtils.exportExcel(data); #优化前工具类
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime + "ms");
}

  1. 首先打开优化前的工具类方法调用,注释掉优化后调用的代码,并在测试方法中打一个断点,使用debug模式启动程序

  1. 打开命令行,输入jconsole,会弹出一个gui界面,选择本地进程中debug的那个进程,点击连接

  1. 放开debug断点,继续执行程序,可以在gui界面上看到实时内存使用情况

可以看到优化前代码内存占用率在持续升高,直到堆内存满为止,这样最终就导致oom的情况。

  1. 打开优化后的代码,重新执行以上步骤, 结果如下

可以看到优化后代码内存占用最高时只有700M,并且很快就回收完成了。

小结

以上是通过POI的XSSFWorkbook和SXSSFWorkbook方式导出excel演示的例子,可以通过jconsole工具,较为直观的展现出两种方式在大批量数据导出excel时的内存使用情况,对于重现oom和进行性能调优非常有帮助。