目录
简述
最近在开发的项目运行时发现内存在不断增长,推测是发生了内存泄漏。解决内存泄露的难点在于找到泄漏的点,只要找到问题所在,一切就迎刃而解。
Memory Profiler Workflow
Memory Profiler的介绍和查找内存泄漏的操作步骤可见Memory Profiler manual,这里有非常详细的说明,建议先看再结合实际操作。
简单来说查找内存泄漏的方式就是获取前后的两个时间点内存快照进行对比,对same和new分组中的条目进行分析,然后对不合理的地方进行排查。
查找例子
例子1
Diff和NativeSize选择Group,然后对NativeSize降序排序
在new组下发现存在多个同名的Sprite,查看代码时注意到在SpriteAtlas获取Sprite时使用了GetSprite()方法,而这个方法每次都会Clone一个资源在本机堆上,所以当UIImage多次切换时,就造成了泄漏。
例子2
根据Type分组,可以看到有有一个类个数明显存在异常
点击IPBoat的引用,可以看到是作为一个字典的key被引用,在使用后没有从字典中移除造成了泄漏
参考链接
Memory Profiler manual: https://docs.unity3d.com/Packages/com.unity.memoryprofiler@0.2/manual/index.html