一次脚本测试的内存增长问题

问题背景

问题描述:进入应用的视频素材剪辑页面然后退出,脚本循环执行500次,内存增长156M

问题分析

分析增长曲线图

在这里插入图片描述

曲线反映了从0到500次脚本执行过程中adb shell dumpsys meminfo抓取内存的增长情况,可以看出是Native内存一直增长未释放。

Profiler工具分析

将执行100的hprof和500次的hprof文件分别导入Android Studio的Profiler中。
100次
500次
可以看到“0 Leaks”,以及Native Size只增长了200k左右。至此,Profiler体现不出内存增长的原因。

MAT工具分析

hprof格式转换

利用sdk\platform-tools中的hprof-conv.exe将hprof转换为MAT可识别的文件

hprof对比

用MAT打开100次和500次的hprof文件,然后进行对比两份hprof
在这里插入图片描述
可以看到WeakReference、ViewRootImpl.W、Cleaner和NativeAllocationRegistry.CleanerThunk的对象数量增长比较多。

分析ViewRootImpl.W

查看ViewRootImpl.W发现是一个和Window相关的Binder接口
在这里插入图片描述
查看ViewRootImpl.W的引用关系,
在这里插入图片描述
发现是被Cleaner所持有,得出ViewRootImpl.W增长是因为Cleaner在增长。

分析Cleaner

查看源码

public class Cleaner extends PhantomReference<Object>
{// Dummy reference queue, needed because the PhantomReference constructor// insists that we pass a queue.  Nothing will ever be placed on this queue// since the reference handler invokes cleaners explicitly.//private static final ReferenceQueue<Object> dummyQueue = new ReferenceQueue<>();// Doubly-linked list of live cleaners, which prevents the cleaners// themselves from being GC'd before their referents//static private Cleaner first = null;private Cleanernext = null,prev = null;private static synchronized Cleaner add(Cleaner cl) {if (first != null) {cl.next = first;first.prev = cl;}first = cl;return cl;}private static synchronized boolean remove(Cleaner cl) {// If already removed, do nothingif (cl.next == cl)return false;// Update listif (first == cl) {if (cl.next != null)first = cl.next;elsefirst = cl.prev;}if (cl.next != null)cl.next.prev = cl.prev;if (cl.prev != null)cl.prev.next = cl.next;// Indicate removal by pointing the cleaner to itselfcl.next = cl;cl.prev = cl;return true;}private final Runnable thunk;private Cleaner(Object referent, Runnable thunk) {super(referent, dummyQueue);this.thunk = thunk;}/*** Creates a new cleaner.** @param  ob the referent object to be cleaned* @param  thunk*         The cleanup code to be run when the cleaner is invoked.  The*         cleanup code is run directly from the reference-handler thread,*         so it should be as simple and straightforward as possible.** @return  The new cleaner*/public static Cleaner create(Object ob, Runnable thunk) {if (thunk == null)return null;return add(new Cleaner(ob, thunk));}/*** Runs this cleaner, if it has not been run before.*/public void clean() {if (!remove(this))return;try {thunk.run();} catch (final Throwable x) {AccessController.doPrivileged(new PrivilegedAction<Void>() {public Void run() {if (System.err != null)new Error("Cleaner terminated abnormally", x).printStackTrace();System.exit(1);return null;}});}}}

查看引用关系
在这里插入图片描述
可以看到Cleaner类是链表结构,不再好继续往下分析了。

分析WeakReference

从上面ViewRoomImpl.W源码可以看到有WeakReference类型的成员变量,推断WeakReference增长832次有400次是因为ViewRootImpl.W增长400次。用MAT合并虚引用、软引用和弱引用
在这里插入图片描述
剩余没有被过滤的133个对象,查看存放的值有很多和音视频播放相关
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

反馈给火山SDK

屏蔽视频播放功能

视频素材剪辑页面主要有视频抽帧和视频播放功能两个功能,结合上面WeakReference的分析,怀疑视频播放功能产生了Native的泄露。删除播放器的初始化,跑脚本复测后发现内存平稳。

问题解决

火山同事发现是so中shared_ptr循环引用导致,更新版本后解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/223135.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学Go web——第一天

文章目录 从零开始学Go web——第一天一、Go与web应用简介1.1 Go的可扩展性1.2 Go的模块化1.3 Go的可维护1.4 Go的高性能 二、web应用2.1 工作原理2.2 各个组成部分2.2.1 处理器2.2.2 模板引擎 三、HTTP简介四、HTTP请求4.1 请求的文本数据4.2 请求方法4.2.1 请求方法类型4.2.2…

聊聊如何进行代码混淆加固

​ 聊聊如何进行代码混淆 前言什么是代码混淆代码混淆&#xff0c;是指将计算机程序的代码&#xff0c;转换成一种功能上等价&#xff0c;但是难于阅读和理解的形式的行为。 代码混淆常见手段1、名称混淆 将有意义的类&#xff0c;字段、方法名称更改为无意义的字符串。生成…

Leetcode—160.相交链表【简单】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—160.相交链表 算法思想 两个链表的节点之和是相等的 如果两个链表相交&#xff0c;那么相交点之后的长度是相同的 我们需要做的事情是&#xff0c;让两个链表从同距离末尾同等距离的位置开始遍历。这个位置只能是较短…

leetcode 41. 缺失的第一个正数

目录&#xff1a;原题链接 暴力排序 桶排序 桶排序Set 桶排序分治思想 官方题解 桶排序数组内标记 桶排序额外数组标记&#xff08;更好理解&#xff09; 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) …

1-1、汇编语言概述

语雀原文链接 文章目录 1、机器语言2、汇编语言&#xff08;Assembly Language&#xff09;汇编语言工作过程汇编语言三类指令 3、学习资料电子PDF课件论坛视频教程 1、机器语言 机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器…

【牛客网】SQL必知必会题解

SQL 必知必会题解 地址&#xff1a;牛客网在线编程_SQL篇_SQL必知必会 (nowcoder.com) 检索数据 从 Customers 表中检索所有的 ID 现有表 Customers 如下&#xff1a; cust_idABC 【问题】编写 SQL 语句&#xff0c;从 Customers 表中检索所有的 cust_id 答案&#xff1a;…

SAP MPN物料简介

MPN物料-Manufacturer Part Number (MPN) 我们将把它简称为MPN物料。所谓制造商零件号&#xff0c;指的是以制造商&#xff08;注意不是供应商&#xff09;作为区分依据&#xff0c;为事实上的同一种物料定义不同的物料号。 我们在业务逻辑中&#xff0c;一物一码是基本的业务…

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SCN随机配置网络多变量回归预测 1.data为数据集&#xff0c;7个输入特征&#xff0…

JDBC编程基础

JDBC编程基础 JDBC介绍创建JDBC项目的步骤1.引入依赖2.注册驱动3.获取数据库连接4.获取sql执行对象 JDBC 常用 API 详解sql执行对象PreparedStatement作用 事务管理结果集对象 JDBC项目demo测试 JDBC介绍 每个数据库都会提供一组API来支持程序员实现自己客户端&#xff0c;自己…

vim工具以及如何给用户加上sudo的权限

Linux开发工具之vim以及如何给用户配置sudo的权限文件的操作 1.vim概念的介绍 2.vim的多模式的介绍 3.vim的命令模式与低行模式的相关指令操作 4.vim如何配置 5.如何给普通用户配置sudo的权限 本文开始~~~~ 1. vim概念的介绍 vim是一款多模式的文本编辑器&#xff0c;简单…

C++之哈希

unordered系列容器的效率之所以比较高(尤其是查找),是因为它底层使用了哈希结构,即哈希表. 哈希概念 前言: 顺序结构以及平衡树中, 元素关键码与其存储位置之间没有对应的关系, 因此在查找一个元素 时, 必须要经过关键码的多次比较. 顺序查找时间复杂度为O(N), 平衡树中为树的…

【微服务】java 规则引擎使用详解

目录 一、什么是规则引擎 1.1 规则引擎概述 1.2 规则引擎执行过程 二、为什么要使用规则引擎 2.1 使用规则引擎的好处 2.1.1 易于维护和更新 2.1.2 增强应用程序的准确性和效率 2.1.3 加快应用程序的开发和部署 2.1.4 支持可视化和可管理性 2.2 规则引擎使用场景 三、…