【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )
前言
简介: 【过错记载】Android 内存走漏 过错排查记载 ( FinalizerReference 内存走漏 )
文章目录
一、 报错信息
二、 内存排查
三、 代码剖析及修正
四、 不同版别说明
参阅以下博客 :
【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() , 导致了内存走漏 ;
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); } }
修正计划 : 将创立目标语句移动到循环外部 , 在循环中只复用目标 , 这样内存走漏问题解决 ;
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 操作系统中呈现 , 这个问题要注意 , 开发时要在不同版别的手机中进行内存功能优化测验 ;
文章目录
一、 报错信息
二、 内存排查
三、 代码剖析及修正
四、 不同版别说明
参阅以下博客 :
【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() , 导致了内存走漏 ;
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); } }
修正计划 : 将创立目标语句移动到循环外部 , 在循环中只复用目标 , 这样内存走漏问题解决 ;
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 操作系统中呈现 , 这个问题要注意 , 开发时要在不同版别的手机中进行内存功能优化测验 ;
长期稳定+永久朋友(12年分销)
部分客户(无排名)
热门文章
- 阿里云代理《云服务ECS/RDS》购买流程
- 如何修改阿里云服务器密码?
- 天翼云到底如何?阿里云PK天翼云!
- [图文教程]利用wdcp控制面板自助建站
- [图文教程]阿里云服务器挂载数据盘/安装wdcp
- 如何使用阿里云代金券?
- 阿里云vnc密码,如何修改VNC密码?
- wdcp-linux管理后台无法登录的解决方法
- BigDump 数据库导入工具
- 企业数据免受勒索软件攻击的 5 种方式
- [视频教程]Putty远程连接Linux服务器
- widnows 3389修改器
- 购买阿里云服务器之前一定要看的文章
- 金秋云创季·云上聚·创未来-阿里云双十一活动开始啦!
- QQ邮箱如何设置别名?
- 阿里云企业邮箱邮件组批量添加多个成员邮箱的方法
- [视频教程]远程桌面访问windows主机
- 聊聊大数据下的存算分离
我有话说: