发现
- 线上反馈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就行了,多此一举了..