使用 Snapdragon Profiler 分析 Android 应用的 GPU 内存泄露

简介: 前几天同事发现一个正在开发的小程序在反复进入退出时,应用的 GPU 内存占用会一直上涨直到触发 OOM,因为小程序使用了内核作为渲染引擎,所以怀疑是内核发生内存泄露,让我帮忙分析看看。 > Snapdragon Profiler Snapshot Capture 进入小程序后,使用 [Snapdragon Profiler][1] Snapshot Capture 抓取了当前帧的

前几天同事发现一个正在开发的小程序在反复进入退出时,应用的 GPU 内存占用会一直上涨直到触发 OOM,因为小程序使用了内核作为渲染引擎,所以怀疑是内核发生内存泄露,让我帮忙分析看看。

Snapdragon Profiler

Snapdragon Profiler Snapshot Capture

进入小程序后,使用 Snapdragon Profiler Snapshot Capture 抓取了当前帧的 GPU 快照,可以看到一共分配了 4 个 GL Context。

Texture

查看每个 Context 分配的纹理

点击右上角的 All 可以看到每个 Context 分配的纹理,从分配的纹理内容很快就猜到了其中三个 Context 的分配来源和用途。一个是 Android UI 渲染引擎 HWUI 分配的,一个是我们浏览器内核分配的,还有一个是因为摄像头扫码模块分配。而第四个 Context 分配了大量的纹理,但是不知道是哪个模块分配的。

退出小程序后在应用的主界面再抓一帧 Snapshot,可以发现内核分配的 Context 已经释放了绝大部分的纹理(只保留一些内部作为 placeholder 使用),而第四个 Context 没有释放纹理。再进入小程序后再抓一次 Snapshot,发现该 Context 重复分配了同样的纹理,从而可以确定是这个 Context 发生了泄漏。把这个 Context 分配的纹理截图发给同事,很快就确认了是应用的一个 Native 组件自己分配的 GL Context 发生了泄漏。

一些 takeaway:

  1. Chromium 内核本身只会分配一个物理 GL Context,WebGL,Canvas,合成器,光栅化器都是共用同一个 Context(一般是通过 Command Buffer 进行多路复用);
  2. 超级 App 通常整合了多个不同组件,这些组件有可能使用了不同的渲染引擎,有自己的 GL Context 和纹理缓存池,如果发生 GPU 内存泄漏使用一些底层的 Profiler 工具外部工具进行对应用进行全面分析更容易找出问题;
  3. 因为嵌入式 View 和混合渲染的使用,网页可能内嵌了其它 Native 组件,这些组件可能有自己的 GL Context;

关于 Snapdragon Profiler 使用过程碰到的常见问题的 Q&A:

  1. Snapdragon Profiler 支持 Windows/Mac/Linux,但是因为是使用 .Net 开发,在 Linux 下要安装 Mono 框架,安装和使用比较麻烦,建议使用 Mac 或者 Windows;
  2. 理论上现在使用高通芯片的手机都支持,如果不行可以使用 Pixel 系列;
  3. 云真机这种 adb 通过网络映射的链接,Snapshot 会无法获取数据,需要使用数据线链接实机;Chromium 内核本身只会分配一个物理 GL Context,WebGL,Canvas,合成器,光栅化器都是共用同一个 GL Context
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
1月前
|
存储 前端开发 Java
Android MVVM架构模式下如何避免内存泄漏
Android采用MVVM架构开发项目,如何避免内存泄漏风险?怎样避免内存泄漏?
89 1
|
1月前
|
测试技术 异构计算
|
9天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
10天前
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
1月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
1月前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
49 2
|
1月前
|
人工智能 调度 开发工具
xGPU来啦!免费GPU资源开发花样AI应用!
为了降低AI应用服务和推广的门槛,解决开发者面临的实际痛点,ModelScope社区推出 xGPU 服务,让大家能够免费使用高性能 GPU 资源,托管自己的AI应用服务。
|
2月前
|
Java 测试技术 Android开发
Android性能测试——发现和定位内存泄露和卡顿
本文详细介绍了Android应用性能测试中的内存泄漏与卡顿问题及其解决方案。首先,文章描述了使用MAT工具定位内存泄漏的具体步骤,并通过实例展示了如何分析Histogram图表和Dominator Tree。接着,针对卡顿问题,文章探讨了其产生原因,并提供了多种测试方法,包括GPU呈现模式分析、FPS Meter软件测试、绘制圆点计数法及Android Studio自带的GPU监控功能。最后,文章给出了排查卡顿问题的四个方向,帮助开发者优化应用性能。
171 4
Android性能测试——发现和定位内存泄露和卡顿
|
30天前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
2月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
70 0