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

作者阿里云代理 文章分类 分类:linux图文教程 阅读次数 已被围观 984

前言
简介: 【过错记载】Android 内存走漏 过错排查记载 ( FinalizerReference 内存走漏 )

文章目录

一、 报错信息

二、 内存排查

三、 代码剖析及修正

四、 不同版别说明



参阅以下博客 :


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


【Android 内存优化】运用 Memory Analyzer ( MAT ) 东西剖析内存 ( hprof 文件转换 | MAT 东西下载 | MAT 东西运用 )


【Android 内存优化】运用 Memory Analyzer ( MAT ) 东西剖析内存 ( MAT 东西运用 | 最大目标 | 类实例个数 | 引证与被引证 | GC Roots 最短链 )






一、 报错信息


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

image.png



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


image.png



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

image.png




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


image.png






二、 内存排查


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


image.png


一般状况下 , 不用多想 , 便是第一个类的目标内存走漏 , 这儿的第一个类时 FinalizerReference 类 , 该目标创立了 5149 个 , 这儿走漏的内存便是这个目标走漏的 ;


点击该目标 , 即可弹出右侧对话框 , 显现着创立的 5149 个目标的信息 ;


image.png



再次点击右侧的某个目标 , 翻开该目标创立时的调用栈 , 检查究竟在什么地方 , 创立了这么多 FinalizerReference 目标 ;


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


image.png






三、 代码剖析及修正


点击上面的调用栈最上层的办法 , 在循环里呈现不断创立目标的办法 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 操作系统中呈现 , 这个问题要注意 , 开发时要在不同版别的手机中进行内存功能优化测验 ;



本公司销售:阿里云新/老客户,只要购买阿里云,即可享受折上折优惠!>

我有话说: