【unity】代码堆内存检测泄漏,使用Profiler与UWA查

内存类别

资源内存
堆内存
System.ExecutableAndDlls: 如果接入的sdk和dll少点 是否也会少呢?

内存分配

在程序运行时由CLR管理内存分配(Memory Allocation),程序启动时,操作系统会为每一个线程申请一个独立的栈内存,用于存储方法的局部变量、参数和返回值等;CLR会为进程申请一个连续的内存空间作为托管堆内存,用于存储引用类型对象和类型对象等;

Unity Profiler

Reserved Total 和 Used Total为Unity引擎在内存方面的总体分配量和总体使用量。 一般来说,引擎在分配内存时并不是向操作系统 “即拿即用”,而是首先获取一定量的连续内存,然后供自己内部使用,待空余内存不够时,引擎才会向系统再次申请一定量的连续内存进行使用。

UWA

使用流程:

下载uwa sdk
接入uwa sdk
一键设置打包
打开游戏,start uwa,游玩游戏
安装uwa tool,上传数据

UWA模式

GPM:QA人员日常监控性能宏观数据

GOT:是一个本地测试工具,需要配合Unity Editor使用,在本地真机测试后把数据上传到编辑器中查看,支持Overview、assets、mono三种模式,需要300多一次性对账号进行购买,然后可以无限次数的使用

GOT Online:是一个线上分析服务,可以把本地真机测试的数据上传到UWA官网,进行云端分析,在网页端查看数据;支持Overview、assets、mono、Lua四种模式

真人真机测试:是在线测评服务,由于它的数据量更大更全面,所以需要把集成了UWA SDK的apk上传到UWA官网,由uwa官方来进行测试,最后生成一份全面深入的性能报告

Direct模式进行测试可以一直使用

UWA Mono内存分析

  1. 内存分配,是运行逻辑过程产生的内存,即使是一些临时的例如string.split
  2. 内存泄漏,是运行逻辑过程内存一直留着没清的,查看是那些变量还存在,那么那个类就存在,那么就是有全局地方在引用那个类

【unity】代码堆内存检测泄漏,使用Profiler与UWA查_第1张图片
 

内存泄漏查找

一般来说UWA会10k帧打一个快照
然后可以通过不断看快照是哪个不断在增加来确定泄漏点
因为有些内存是一直在的 但并不是泄漏  所以要看不断增加的 是否合理 例如可能是因为放到池 可能真的就是泄漏

内存泄漏记录

  1. 对于不断增加的内存泄漏 肯定是全局引用了类/引用类型变量/方法引起的
  2. 对于不断增加的内存泄漏 只有数组类型或者Action会导致内存越来越多,其他一般只会有一份内存泄漏,所以可以优先查看数组和Action
  3. 结合uwa 就知道哪里被引用
  4. 比较困难的是 如果泄漏点多就会到处怀疑 因为泄漏的方法被多处引用。。
  5. 即使mono代码所在的GameObject删了,如果还有引用,那么内存依然存在
  6. 即使没有内存泄漏 内存也会顶高到一定程度才不再增加(这个比较奇怪 不是很懂)

内存分配点记录


内存泄露
【unity】代码堆内存检测泄漏,使用Profiler与UWA查_第2张图片

分析:unknownCallStack一般是匿名函数或者事件
可以看到内存泄漏时,留存数极大 

内存分配:

【unity】代码堆内存检测泄漏,使用Profiler与UWA查_第3张图片

可以看到哪个方法分配的多

你可能感兴趣的:(Unity,内存泄漏)