前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )

【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )

作者头像
韩曙亮
发布2023-03-27 21:55:10
8010
发布2023-03-27 21:55:10
举报

文章目录

参考以下博客 :

【Android 内存优化】Android Profiler 工具常用功能 ( 监测内存 | 内存快照 )

【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 )

【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )

一、 报错信息


启动 Profiler 调试 Android 应用 , 点击如下红色选框中的按钮 , 启动后会自动开启 Profiler 界面 ;

在这里插入图片描述
在这里插入图片描述

点击 MEMORY 面板 , 即可进入 Memory 监控界面 , 在该界面中可以监控内存运行情况 ;

在这里插入图片描述
在这里插入图片描述

开始执行时运行平稳 , 内存一直保持在 97.4 MB 左右 ;

在这里插入图片描述
在这里插入图片描述

开启某方法后 , 显示某自定义组件 , 不断循环绘制某多边形 , 出现如下内存情况 :

在这里插入图片描述
在这里插入图片描述

二、 内存排查


点击内存监控面板左上角的 Record 按钮 , 录制一段内容 , 然后进入如下界面 ;

在这里插入图片描述
在这里插入图片描述

一般情况下 , 不用多想 , 就是第一个类的对象内存泄漏 , 这里的第一个类时 FinalizerReference 类 , 该对象创建了 5149 个 , 这里泄漏的内存就是这个对象泄漏的 ;

点击该对象 , 即可弹出右侧对话框 , 显示着创建的 5149 个对象的信息 ;

在这里插入图片描述
在这里插入图片描述

再次点击右侧的某个对象 , 打开该对象创建时的调用栈 , 查看究竟在什么地方 , 创建了这么多 FinalizerReference 对象 ;

发现是在一个自定义组件中 , 该组件的需求是根据用户操作 , 实时显示多边形 , 多边形基本是每隔 20ms , 就要重绘一次 , 这里需要在 onDraw 方法中循环处理多边形绘制 ;

在这里插入图片描述
在这里插入图片描述

三、 代码分析及修改


点击上面的调用栈最上层的方法 , 在循环里出现不断创建对象的方法 Path path = new Path() , 导致了内存泄漏 ;

代码语言:javascript
复制
private void draw(){
	while(true){
		Path path = new Path();
        path.moveTo(x, y);
        path.lineTo(x1, y1);
        path.lineTo(x2, y2);
        path.close();
        canvas.drawPath(path, paint);
	}
}

修改方案 : 将创建对象语句移动到循环外部 , 在循环中只复用对象 , 这样内存泄漏问题解决 ;

代码语言:javascript
复制
private void draw(){
	Path path = new Path();
	while(true){
		path.reset();
        path.moveTo(x, y);
        path.lineTo(x1, y1);
        path.lineTo(x2, y2);
        path.close();
        canvas.drawPath(path, paint);
	}
}

总结 : 不要在循环里创建对象 , 只能复用对象 , 或者使用已有的对象 ;

很小白的问题 , 找了好几个小时 , 记录下 , 吸取教训 ;

四、 不同版本说明

上述 内存泄漏 在 Android 10 操作系统中没有 , 在 Android 7 操作系统中出现 , 这个问题要注意 , 开发时要在不同版本的手机中进行内存性能优化测试 ;

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、 报错信息
  • 二、 内存排查
  • 三、 代码分析及修改
  • 四、 不同版本说明
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com