使用 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
相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
目录
相关文章
|
3天前
|
Android开发
Android应用实例(一)之---有道辞典VZ.0
Android应用实例(一)之---有道辞典VZ.0
10 2
|
1天前
|
移动开发 API Android开发
构建高效Android应用:Kotlin协程的实践指南
【5月更文挑战第11天】 在移动开发领域,性能优化和资源管理是至关重要的。特别地,对于Android开发者来说,合理利用Kotlin协程可以极大地改善应用的响应性和稳定性。本文将深入探讨Kotlin协程在Android中的实际应用,包括它们如何简化异步编程模型、提高UI线程的响应性,以及减少内存消耗。我们将通过具体案例分析,了解如何在实际项目中有效地使用协程,从而帮助开发者构建更加高效的Android应用程序。
|
3天前
|
开发工具 Android开发 Windows
Android应用] 问题2:ERROR: unknown virtual device name:
Android应用] 问题2:ERROR: unknown virtual device name:
|
3天前
|
XML JSON API
转Android上基于JSON的数据交互应用
转Android上基于JSON的数据交互应用
|
3天前
|
机器学习/深度学习 人工智能 异构计算
【Docker 专栏】Docker 与 GPU 加速应用的结合
【5月更文挑战第9天】GPU加速技术在处理大规模数据和复杂计算时展现强大性能,尤其在AI和深度学习领域。Docker作为轻量级容器化工具,提供隔离、可移植和高效的环境。结合GPU加速,关键在于容器访问GPU设备和安装相应驱动。NVIDIA提供了支持工具,允许Docker利用GPU。应用场景包括人工智能、科学计算和视频处理。优势包括资源利用率提升和部署灵活性,但面临驱动兼容性、资源管理和监控调试的挑战。未来,随着技术发展,Docker与GPU加速在边缘计算中的应用将有广阔前景。
【Docker 专栏】Docker 与 GPU 加速应用的结合
|
4天前
|
安全 Java Android开发
构建高效Android应用:采用Kotlin进行内存优化的策略
【5月更文挑战第8天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,合理管理内存资源是确保应用流畅运行的关键因素之一。近年来,Kotlin作为官方推荐的开发语言,以其简洁、安全和互操作性的特点受到开发者青睐。本文将深入探讨利用Kotlin语言特性,通过具体策略对Android应用的内存使用进行优化,旨在帮助开发者提高应用性能,减少内存消耗,避免常见的内存泄漏问题。
8 0
|
5天前
|
Android开发
Android 设备清理内存 RAM
Android 设备清理内存 RAM
9 0
|
5天前
|
移动开发 数据库 Android开发
构建高效Android应用:Kotlin协程的全面应用
【5月更文挑战第7天】 在移动开发领域,性能优化与流畅的用户体验是至关重要的。随着Kotlin语言的流行,其并发神器——协程,已成为提升Android应用性能的重要工具。本文将深入探讨如何在Android项目中利用Kotlin协程进行异步编程、网络请求和数据库操作,以及如何通过协程简化代码结构,增强应用的响应性和稳定性。我们的目标是为开发者提供一套实用的协程使用模式和最佳实践,以便构建更加高效的Android应用。
22 3
|
16天前
|
Linux
Linux rsyslog占用内存CPU过高解决办法
该文档描述了`rsyslog`占用内存过高的问题及其解决方案。
40 4
|
1月前
|
移动开发 运维 监控
掌握Linux运维利器:查看CPU和内存占用,轻松解决性能问题!
掌握Linux运维利器:查看CPU和内存占用,轻松解决性能问题!