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

简介: 【错误记录】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 操作系统中出现 , 这个问题要注意 , 开发时要在不同版本的手机中进行内存性能优化测试 ;


目录
相关文章
|
1月前
|
编解码 算法 Java
构建高效的Android应用:内存优化策略详解
随着智能手机在日常生活和工作中的普及,用户对移动应用的性能要求越来越高。特别是对于Android开发者来说,理解并实践内存优化是提升应用程序性能的关键步骤。本文将深入探讨针对Android平台的内存管理机制,并提供一系列实用的内存优化技巧,以帮助开发者减少内存消耗,避免常见的内存泄漏问题,并确保应用的流畅运行。
|
28天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
79 0
|
8天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
14 0
|
10天前
|
缓存 移动开发 Java
构建高效的Android应用:内存优化策略
【4月更文挑战第16天】 在移动开发领域,尤其是针对资源有限的Android设备,内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨Android应用的内存管理机制,分析常见的内存泄漏问题,并提出一系列实用的内存优化技巧。通过这些策略的实施,开发者可以显著减少应用的内存占用,避免不必要的后台服务,以及提高垃圾回收效率,从而延长设备的电池寿命并确保应用的流畅运行。
|
10天前
|
存储 缓存 监控
Java内存管理:垃圾回收与内存泄漏
【4月更文挑战第16天】本文探讨了Java的内存管理机制,重点在于垃圾回收和内存泄漏。垃圾回收通过标记-清除过程回收无用对象,Java提供了多种GC类型,如Serial、Parallel、CMS和G1。内存泄漏导致内存无法释放,常见原因包括静态集合、监听器、内部类、未关闭资源和缓存。内存泄漏影响性能,可能导致应用崩溃。避免内存泄漏的策略包括代码审查、使用分析工具、合理设计和及时释放资源。理解这些原理对开发高性能Java应用至关重要。
|
25天前
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
27 5
|
28天前
|
监控 网络协议 NoSQL
java线上排查OOM内存溢出
java线上排查OOM内存溢出
22 0
|
1月前
|
缓存 Linux iOS开发
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
65 1
|
1月前
|
缓存 移动开发 Java
构建高效Android应用:内存优化实战指南
在移动开发领域,性能优化是提升用户体验的关键因素之一。特别是对于Android应用而言,由于设备和版本的多样性,内存管理成为开发者面临的一大挑战。本文将深入探讨Android内存优化的策略和技术,包括内存泄漏的诊断与解决、合理的数据结构选择、以及有效的资源释放机制。通过实际案例分析,我们旨在为开发者提供一套实用的内存优化工具和方法,以构建更加流畅和高效的Android应用。
|
1月前
|
监控 Java Android开发
构建高效Android应用:从内存管理到性能优化
【2月更文挑战第30天】 在移动开发领域,打造一个流畅且响应迅速的Android应用是每个开发者追求的目标。本文将深入探讨如何通过有效的内存管理和细致的性能调优来提升应用效率。我们将从分析内存泄露的根本原因出发,讨论垃圾回收机制,并探索多种内存优化策略。接着,文中将介绍多线程编程的最佳实践和UI渲染的关键技巧。最后,我们将通过一系列实用的性能测试工具和方法,帮助开发者监控、定位并解决性能瓶颈。这些技术的综合运用,将指导读者构建出更快速、更稳定、用户体验更佳的Android应用。