上个月老周端着笔记本来找我,脸皱的跟抹布似的。他们那边对账单跑批炸了,POI 写 Excel,八万行写到一半直接 java.lang.OutOfMemoryError: Java heap space。他调了两天,把 -Xmx 从 2G 加到 8G,勉强能跑完,六分半。业务那边一天催三遍。
我第一反应是这跟我有什么关系,第二反应是——我可以给他看看。
中午吃完饭我把他按在我工位旁边,打开编辑器,噼里啪啦敲了一段:帮我优化 Java 导出 Excel 的性能问题。回车,等了一分多钟,出来一大堆东西。三层架构、工厂模式、接口抽象、还有个 ExportStrategy,光文件给我整出七个。老周在旁边憋着笑,最后实在憋不住,说白哥这个要是上线,我们 review 都得开到下礼拜。
我脸上有点挂不住,嘴上还得硬:工具没问题,是我问的不到位。
这话说出去我自己都不太信。当天晚上回家,九点多,我把老周发我的堆栈整段原样贴进去,一行没删,连他那些 at com.xxx.export.ReportService 的包名都在里面。这次它没给我整架构,直接指出两件事:一是 CellStyle 每行 new 一份,样式对象在堆里堆成山;二是让我换成 SXSSFWorkbook 流式落盘,别整本攒在内存里。我照着改了二十来行代码。
第二天我七点四十就到公司了,说实话是怕再翻车。八万行,四十一秒。我又跑了一遍,四十一秒。第三遍我故意把数据加到十二万行,一分零四。我把改完的 diff 打印出来,中午吃饭的时候搁老周桌上,装作很不经意地说,喏,你那个事我昨晚顺手看了下。
他翻了翻,说这也没啥,不就是把我的问题翻译了一遍。
行吧,翻译。他自己不翻译。
三天后我路过他工位,看见他屏幕上开着那个 Cursur——管它叫什么,反正就这么个东西,我也记不清全名,不重要。他一见我过来,刷一下就把窗口切了。我当时什么也没说,心里挺舒服的,那种感觉说不上来,反正比发年终奖舒服。
结果打脸来的比我想的快。
又过了一个礼拜,他弄了个更邪门的。他把我们库的表结构导出来喂进去,让 AI 给他生成对账 SQL 的骨架,他一个做 Java 的,根本不懂我们那几个字段什么含义,就一条一条追问,问的还挺细。跑出来的结果跟财务手工核的对上了,组长会上点了他一句。我坐在下面,第一反应是浮躁,第二反应是我上周好像也是这么干的。
当年我们查这种内存问题,是拿着 jmap 打堆转储,MAT 里一行一行看引用链,一蹲一晚上——算了,说了你们也没赶上。
话说回来,这玩意在我这儿也就是打打下手。真本事还是得知道该问什么、该往哪儿问,机器又不懂业务。但老周那天问的那几个问题,我得承认,问到了点子上。仅此一次。下不为例。
还有,我们那套对账跑批系统是 PHP 写的,接的同一家接口,屁事没有。谁再说 PHP 死了,让他过来看看。