多线程模式下也能定位堆内存问题了!

简介:

一、功能研发背景

随着大家研发项目的复杂度逐渐增高,我们发现越来越多的项目开始将一些与Unity API无关的操作放到子线程中进行处理,比如文件的读取、解压和解密等操作,网络信息的收发操作,甚至一些自定义功能的逻辑操作等。这样做的好处显而易见,即:降低主线程的压力,同时提升项目的运行帧率。但是,它却给大家在堆内存分析时带来了新的“麻烦”—Mono的总体堆内存占用很高,但我们之前的性能报告或者Unity Profiler中却无法看到是哪个函数分配出来的。这是因为,子线程中的堆内存分配是抓取不到的。


二、实例说明

通常,如果在脚本中进行了堆内存分配,在Unity Profiler中可以在对应帧看到具体的分配大小。如下图中的代码,及对应的调用帧的信息。
请输入图片描述
请输入图片描述

然而,如果是在子线程中进行该操作,其所分配的堆内存在目前的Unity Profiler中则不会有显示。如下图中的代码,及对应的调用帧的信息。
请输入图片描述
请输入图片描述

可以看到对应的调用帧分配仅为276B,而堆内存的使用值在该帧前后,却增加了1MB,见下图。
请输入图片描述

以上这种情况是我们在研发团队中经常碰到的,对此,我们这几个月来对多线程的堆内存分配操作进行大量的试验和研究,并终于可以在今天向大家推出该功能。


三、子线程Mono堆内存分析功能

在最新的UWA线上性能测评的Mono堆内存分析功能中,对于在子线程中存在逻辑操作并产生堆内存的项目,可以在测评报告的“具体堆内存分配”页面中看到前缀为“Thread”的函数,这表示这些函数是在“非主线程”中被调用并且进行了堆内存分配,点击某一函数后,即可看到该函数的堆内存分配细节,下图则为上述子线程调用代码的堆内存分配统计。
请输入图片描述

同时,如果这部分堆内存被引用而无法通过GC释放时,还可以在“堆内存泄漏分析”面板的对应函数中看到这部分堆内存增长情况,如下图所示。
请输入图片描述
请输入图片描述

点击右侧的蓝色按钮后,即可看到对应的堆内存对象类型,及其堆内存分配大小和数量。
请输入图片描述

以上新功能目前仅在UWA线上测评版本中提供,欢迎大家的项目来体验。同时,我们后续会将其集成到本地性能测评工具UWA GOT中,敬请期待!

关于UWA的Mono堆内存分析功能,戳这里可以了解更多信息。
我不会告诉你堆内存泄漏可以自行搞定,不求人!






原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
5月前
|
存储 Java 编译器
【面试知识】Java内存分配之常量池、堆、栈
【面试知识】Java内存分配之常量池、堆、栈
|
5月前
|
存储 Java 测试技术
记一次堆内外内存问题的排查和优化
记一次堆内外内存问题的排查和优化
130 0
|
4月前
|
存储 Java 数据库
jvm性能调优 - 06线上应用部署JVM实战_堆内存预估与设置
jvm性能调优 - 06线上应用部署JVM实战_堆内存预估与设置
61 0
|
2天前
3.默认值不一样【重点】 局部变量:没有默认值,如果要想使用,必须手动进行赋值 成员变量:如果没有赋值,会有默认值,规则和数组一样 4.内存的位置不一样(了解) 局部变量:位于栈内存 成员变量:位于堆内存 5生命周期不一样(了解)
3.默认值不一样【重点】 局部变量:没有默认值,如果要想使用,必须手动进行赋值 成员变量:如果没有赋值,会有默认值,规则和数组一样 4.内存的位置不一样(了解) 局部变量:位于栈内存 成员变量:位于堆内存 5生命周期不一样(了解)
7 0
|
1月前
|
Java Shell
java中jvm使用jststak定位线程cpu占用内存高的线程
java中jvm使用jststak定位线程cpu占用内存高的线程
11 5
|
2月前
|
存储 Linux 程序员
【Linux C/C++ 堆内存分布】深入理解Linux进程的堆空间管理
【Linux C/C++ 堆内存分布】深入理解Linux进程的堆空间管理
84 0
|
2月前
|
算法 编译器 C语言
【C/C++ 实用工具】内存泄漏与堆溢出检测工具一览
【C/C++ 实用工具】内存泄漏与堆溢出检测工具一览
23 0
|
2月前
|
存储 安全 Java
【JVM】Java堆 :深入理解内存中的对象世界
【JVM】Java堆 :深入理解内存中的对象世界
56 0
|
2月前
|
存储 缓存 Rust
【Rust】——所有权:Stack(栈内存)vs Heap(堆内存)(重点)
【Rust】——所有权:Stack(栈内存)vs Heap(堆内存)(重点)
23 0
|
4月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
52 0

相关实验场景

更多