Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )

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

作者头像
韩曙亮
发布于 2023-03-27 13:55:10
发布于 2023-03-27 13:55:10
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

参考以下博客 :

【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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自定义View入门实战案例详析 | 蜘蛛网DataShowView
在onSizeChanged()中, 根据View的长宽, 获取整个布局的中心坐标, 以及计算网状多边形的半径, 后续整个蜘蛛网都是从这个中心坐标开始绘制的:
凌川江雪
2019/08/03
6300
Android关于Path你所知道的和不知道的一切
张风捷特烈
2024/01/26
3000
Android关于Path你所知道的和不知道的一切
Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解
上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas和Paint,从细节上更进一步的讲解自定义View的详细绘制方法。如果把自定义View比作盖一座房子,那么上篇文章就相当于教会了我们怎么一步步的搭建房子的骨架,而本篇文章将要教会我们的是为房子的骨架添砖加瓦直至成型,甚至是怎么装修。 Canvas 为了后文更为方便的讲解Canvas的常用方法的使用,我们先来做一些准备工作,创建一个自定义View框架,
codingblock
2018/03/30
1.2K0
Flutter第1天--初始分析+Dart方言+Canvas简绘
2018-12-16 零前言: 作为一名资深安卓业余爱好者(自诩),感觉应该入一下Flutter的坑了, 不管怎么说,新技术多少要了解一点,本系列就作为我的学习笔记吧 先把今天入坑的感觉写一写: 1.环境的搭建前人把雷踩得差不多了,也不是很麻烦 2.什么都没干呢,TM安装包28M...真把我吓一跳-----于是Flutter的"胖子"形象深入我心 3.Flutter热加载爽到爆,对于喜欢用真机的我,以前每次修改后-->确定安装-->打开... 4.单引号亮了,总算能像写其他语言那样少按个Shi
张风捷特烈
2018/12/27
2.8K0
Android开发之Path详解
在制作高级控件的时候往往会用到很多的高级数学公式,例如本文将要讲到的贝塞尔曲线,结合Path使用,可以实现很多复杂的动画效果。 一.Path常用方法表 作用 相关方法 备注 移动起点 moveTo 移动下一次操作的起点位置 设置终点 setLastPoint 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 连接直线 lineTo 添加上一个点到当前点之间的直线到Path 闭合路径 close 连接第一个点连接到最后一个点,形成一个闭合区域 添加内容
xiangzhihong
2018/02/06
2.5K0
Android开发之Path详解
flutter自定义组件
如何用canvas绘制我们任何想要任意图案的组件,这篇文章用自定义一个五角星组件来说明
韦东锏
2022/04/11
5780
flutter自定义组件
Android N 边形 View
需求千奇百怪,对于登录后账户的头像,要求圆形、多边形、带描边、带 VIP 标示等等,所以实现一个 N 边形玩玩,效果和代码如下。
萬物並作吾以觀復
2021/06/09
4440
Android N 边形 View
Android Canvas 绘制小黄人
自定义MinionView extends View,定义以下成员变量,备用(可以先不看,后面的代码看到莫名其妙出来的变量再上来看下)
音视频开发进阶
2020/07/07
1K0
Android Canvas 绘制小黄人
Path类的最全面详解 - 自定义View应用系列
举例说明2:(非零环绕数规则) 从上面方法分析到,任何图形都是由点连成线组成的,是具备方向的,看下图:(矩形是顺时针)
Carson.Ho
2019/02/22
6890
Android自定义View【实战教程】4⃣️----BitmapShader详解及圆形、圆角、多边形实现
官方定义:Shader used to draw a bitmap as a texture BitmapShader的作用是使用特定的图片来作为纹理来使用。
先知先觉
2019/01/21
1.7K0
O2-开源框架使用之Picasso
零、前言: 个人感觉Picasso还是非常好用的,它是图片加载的类库 1.依赖 implementation 'com.squareup.picasso:picasso:2.71828' 2.如果是请求网络图片:记得权限 <uses-permission android:name="android.permission.INTERNET"/> 3.如果是SD卡图片:记得权限、及运行时处理 <uses-permission android:name="android.p
张风捷特烈
2018/09/29
5190
O2-开源框架使用之Picasso
Android自定义系列——9.Path详细用法
rXxx方法的坐标使用的是相对位置(基于当前点的位移),而之前方法的坐标是绝对位置(基于当前坐标系的坐标)。
老马的编程之旅
2022/06/22
9080
Android自定义系列——9.Path详细用法
Android 贝塞尔曲线实现水纹波动效果
最近工作上比较忙碌,很久没有更新文章了,难得国庆小长假,现在是2019年10月2日凌晨00:49,写一篇简单且实用的贝塞尔曲线应用,许多技术点的文章很多前辈都已经写的很好了,所以 如有纰漏之处,欢迎留言指正,同时也欢迎各位留言需要的技术点类型,争取奉献更优质的技术文章。
黄林晴
2019/10/22
1.3K0
Android 贝塞尔曲线实现水纹波动效果
绘图[下](四)
使用Path不仅能够绘制简单图形,也可以绘制这些比较复杂的图形。 如绘制一个心形 正多边形 五角星等.
李小白是一只喵
2020/04/24
4910
Android内存泄漏分析
强引用:类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
用户1205080
2019/03/06
1.6K0
Android内存泄漏分析
Android关于Path你所知道的和不知道的一切
零、前言 1.canvas本身提供了很多绘制基本图形的方法,普通绘制基本满足 2.但是更高级的绘制canvas便束手无策,但它的一个方法却将图形的绘制连接到了另一个次元 3.下面进入Path的世界,[注]:本文只说Path,关于绘制只要使用Canvas.drawPath(Path,Paint)即可 4.本文将对Path的所有API进行测试。 ---- 一、引:认识Path 例1.绘制网格 在Canvas篇我用Path画过一个网格辅助,在这里分析一下 moveTo相当于抬笔到某点,lineTo
张风捷特烈
2018/12/07
2.6K0
相关推荐
自定义View入门实战案例详析 | 蜘蛛网DataShowView
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验