LuaMemorySnapshotDump icon indicating copy to clipboard operation
LuaMemorySnapshotDump copied to clipboard

第一次快照unity会卡死

Open tianmao888sdo opened this issue 7 years ago • 11 comments

不好意思,内网无法截图,我只能手写了。以下是我的调用 local mri=require 'common.utils.MemoryReferenceInfo'

if Input.GetKeyDown(KeyCode.U) then collectiigarbage("collect") mri.m_cMethods.DumpMemorySnapshot("./","1-Before",10) elseif Input.GetKeyDown(KeyCode.I) then collectiigarbage("collect") mri.m_cMethods.DumpMemorySnapshot("./","2-After,10) elseif Input.GetKeyDown(KeyCode.O) then mri.m_cMethods.DumpMemorySnapshotCompareFile("./","Compared",10,"./LuaMemRefInfo-All-[1-Before].txt","./LuaMemRefInfo-All-[2-After].txt" end 我用的是Slua,对应lua版本5.1,手写输入难免不,但大致是这么写的,我是完全参考你的事例程序这么用的。只要一按U键,立刻屏幕,所有操作都会卡死,也不生成文件(其实到现在我都不知道文件会生成在什么地方)

tianmao888sdo avatar Oct 16 '18 02:10 tianmao888sdo

参数我一开始选的都是-1,但我以为是测试的对象太多了,所以就填成10了,也没用

tianmao888sdo avatar Oct 16 '18 02:10 tianmao888sdo

1.你无论如何都不要在具体项目中使用 "./" 这样的相对路径,我示例中这么写是为了方便保存在当前路径下,slua 或者 ulua 等环境不一样,也会存在读取权限的问题,恐怕你自己都不知道 "./" 会保存到哪里;你应该自己去合并一个明确的路径才对,比如:Application.persistentPath + "/LuaSnapshot/" 或者 Application.dataPath + "/LuaSnapshot/" 类似非常明确的路径才对;

2.mri.m_cMethods.DumpMemorySnapshotCompareFile 中也是一样,显示的传入文件夹路径和文件路径,你修改试试。

yaukeywang avatar Oct 16 '18 14:10 yaukeywang

非常谢谢啊,头一次见到你这么积极回复的博主。昨天我已经猜测出来问题所在了。其实不只是你这个工具,就算是风云写的snapshot工具,我加入到slua.dll重新编译,然后加入全局变量中。当我在lua内用snapshot函数快照时,如果快照的时候是我自己测试的一个对象,因为内容很少,所以很容易就打印出来了。但是当我进入游戏大场景,再调用就会直接卡死,跟用你的工具现象是一样的。所以我暂时怀疑可能是我游戏场景中的临时内存太多了吧

tianmao888sdo avatar Oct 17 '18 02:10 tianmao888sdo

所以我在想,会不会存在监控的变量太多了导致卡死的因素?

tianmao888sdo avatar Oct 17 '18 02:10 tianmao888sdo

这个比较奇怪了,你的 lua memroy 得多大,一般10M以下,5M左右正常,我曾经遇到过因为泄露100M的lua memroy,打印快照也是很快没有死过的情况,不知道你的情况,你需要看看 collectgarbage("count") 的数值,如果这个数值太夸张,比如甚至大于 100M,就得考虑你项目对于lua的使用是不是有什么问题。如果你有数据尽量贴过来帮你看看。

yaukeywang avatar Oct 17 '18 04:10 yaukeywang

我们的项目确实特别大,超大场景无缝地图,还有引擎配合,各种绚丽的shader,场景元素非常庞大。在登录界面,我collectgarbage("count")得到的结果是42525左右,这个时候已经有点卡了。到了场景中,得到的值内存值为180000到380000左右,一直卡死

tianmao888sdo avatar Oct 17 '18 06:10 tianmao888sdo

我们项目之前确实存在内存泄露,就在那一直开着不动,unityproflier看不出来,但从任务管理器上看unity,内存一直在慢慢增长。因为之前都是做功能,一直没重视优化这块,所以现在要出包了,我就被要求做优化工具的研究。感觉你这个和风云那个都挺好,但唯独卡这个事我不知道怎么回事。其实我想如果能减少监控的数目,能不能做到筛选,让工具运行更顺畅一些 我们的场景有大量的本地树木,采集物,交互物,还有大量的npc,怪物,可能是引擎动态刷出来的,也有服务器指挥创建的,引擎本身就站了很多内存了。暂时我只想监控lua层面到c#层面资源的内存使用情况和lua临时变量过多导致的内存问题

tianmao888sdo avatar Oct 17 '18 06:10 tianmao888sdo

现在的问题是,先不考虑内存泄露,我得先找到哪些临时的内存占用了这么多的内存,如果这个不解决,就算没有内存泄露,它平时的正常状态也会占用过多内存

tianmao888sdo avatar Oct 17 '18 07:10 tianmao888sdo

这个没办法,你的虚拟机内存太大了,几百兆,不过也不至于所有操作卡死,顶多unity会卡一会儿,生成过程没那么慢,可能你触发了什么访问权限的东西被系统阻止,你首选确认修改了我上面说的生成路径,应该是你项目的问题。DumpMemorySnapshot 接口最后有两个默认参数,不填的话是打印 debug.registry,你可以显示指定,比如: mri.m_cMethods.DumpMemorySnapshot("./", "1-Before", -1, "_G", _G),只打印 _G 的引用,你可以换成更小的对象试试。

yaukeywang avatar Oct 19 '18 12:10 yaukeywang

至于过滤,你可以自己去修改CollectObjectReferenceInMemory这个接口,按照自己需求修改即可,比较简单。

yaukeywang avatar Oct 19 '18 12:10 yaukeywang

我也同时试了云风的版本和这个版本,我的collectgarbage("count")大约在500M左右,云风的可以生成出来,这个版本不知道为啥也卡了~不是系统权限的原因,还没到输出的逻辑,卡在collect阶段

stillcold avatar Jun 17 '22 07:06 stillcold