发现

  • 线上反馈Hotfix生成错误
  • 检查Hotfix生成Log发现Luajit报错not enough memory

验证

  • 先到打包机上手动执行Hotfix生成,输出相同内存不足报错
  • 检查打包机内存占用未发现异样
  • 在本机测试工程执行该单子Hotfix生成,问题复现,于是在本机调试
  • 代码log定位到lua解析代码一处处理Function的地方,在循环过程中内存不足断掉
  • 尝试把table.concat替换为..,无效果
  • 调整代码逻辑顺序,在循环里做string.sub,放到最后做table.concat,发现可以完成循环,在字符串连接的时候内存爆掉,基本确定是字符串连接的问题
  • 查阅lua文档,lua的string类型为不可修改的常量,每次修改都会new一个新的string出来,怀疑是这个特性导致的内存问题,计数发现此处做了6k次左右的字符串连接,文件大小约1M,也就是平均约占用了1M*6k/2=3G的内存来做这个字符串处理
  • 换用lua5.3可以跑通,可能是内存调度或者gc有优化

解决

  • 解决方案很简单,把原来的顺序连接字符串方式换换就好了,简单弄了个归并解决。
  • update: 直接table.concat就行了,多此一举了..