工作场景
实习培训后第一个修bug任务。
项目具体的场景:在考勤页面的按钮,功能是导出一个考勤的Excel表格,但是在在无标题页面,停滞时间过长(6s)左右极大的影响用户的使用体验感。
解决过程
定位问题出现的位置
用前端定位后端代码方法的位置
如果页面是使用HTML编写,我们就可以在浏览器的开发者模式下找到这个按钮调用的函数,然后再项目中搜索这个函数,通过这个函数找到后端被调用的方法。
如果项目使用有些时间了如果是jsp页面就比较难定位,我是直接查方法名称,再IDEA定位到相关位置。 查到了相关方法后先打个断点。大概粗略浏览一遍注释和代码,如果没有什么注释就,先大致看看代码。
使用日志来测算方法中代码的执行时间
使用debug日志输出信息(提前设置好日志输入的内容-最后时间精度高点,方便查看代码的性能)来把方法分几段,然后直接运行我们需要调试的方法(这里就不用开启debug模式,debug模式会对性能产生影响导致测算出的数据不准确)
当遇到方法比较长的时候,我们可以多输出几个debug日志来确定它们的时间开销--下面是例子
运行后的效果-(包名被我涂掉了)
只需要几次尝试大致就能定位出时间开销比较大的地方,就比如test1到test2输出信息相差5s,对于一共文件导出功能来说,这太漫长了。我们就可以在test1到test2的debug信息之间多开几个debug日志输出,查查看究竟是哪一条语句运行时间有问题?
运行,调用功能并且查看日志
就定位到workbook.createWorkbook()这个方法时间开销最大,我们就进入这个方法详细的查看
如果方法是没有被封装的,就可以进一步调试修改。我面对的这个方法是一个封装好的类-(不是公司自研)
定位到代码后,如何进行对问题的初步了解
先了解问题-what,where,why,how
- 是什么,这个问题是什么:方法是干什么的?
- 哪里来的,了解这个方法的引用来源,是自研还是网上开源
- 为什么要使用它,有没有代替方案(一般当作plan B)
- 怎么去对它进行修改操作
首先,我查到这是一个比较知名的轻量级excel导出类的jar包-jxl 代替方案暂时pass,它本来就代替了另一个比较知名的POI工具 查到了jxl性能读取在1s内(对我当前业务数据估算)
这就问题来了,为什么方法的时间开销是5s,这明显不符合网络上的数据。
我们就直接查找jxl有什么优化方法-使用搜索引擎- 获得---相关文章jxl操作导出慢(看了并不是只有我遇到的问题-这样就好解决了) 当然我们要先去多看看文章,切记不要只看一篇文章就马上进行操作(因为不是对这个内容比较熟悉),最好多看看别人写的文章,看看有没有共同性。如果没有我们就要慢慢搜查,要找到文章中对应自己实际场景配置的地方,或是已经看了挺多文章自己大致了解个大概。可以去官方文档查查是不是这个问题。
(符合我当前项目的场景)现在查的原因就是jxl在执行读写操作时进行了多次的gc(jvm垃圾回收)占用了大量的时间。找到可能的问题原因后,可以自己分析来验证问题,简单验证方法就是用main方法运行业务代码和用tomcat运行业务代码对比差距。
这样我们大致可能找到了问题的原因,我们就可以去找网络上的解决方法。
发现里面有单次sheet时有3个gc的代码
目前找到的方法是关闭自带的设定,关闭里面的手工gc垃圾回收
目标就是让gcDisable==true不执行这三个gc操作就能加快运行时间
修改前
修改后--上面是新增的
只能说维护这样的老项目就像在考古,实习重点学的还是解决问题的思路吧,这个例子也不怎么样,比较不算是自己完完全全自己独立解决,一次争取自己独立解决这类的问题。