玩安卓必须要掌握的性能优化之内存泄漏

简介: 玩安卓必须要掌握的性能优化之内存泄漏

说起性能优化,大多数脑海里便会出现启动优化、UI绘制优化、内存优化等等。之前我也一直在做这些优化,一直没有勇气看内存泄漏的问题,觉得太难,但是,再难也要看啊,跑不了,那么就来吧(做完发现其实也不难)。


内存泄漏的分析很简单,Android Studio中就自带了工具profile:


20200219181015608.png


直接点击这个按钮就会运行应用并进入相应界面:

20200219181437570.png



点击图片中的MEMORY就进入内存的页面:

2020021918173525.png



然后点击左上角的下载按钮(Record旁边),进入详细页面,


20200219182056229.png


可以选为查看包内容,查看下当前运行的活动,然后右击选中内容,选择export,自定导出位置。

20200219182300652.png



导出后需要使用SDK中的hprof-conv工具,这里windows的用户可以直接进入安卓的sdk文件夹下运行cmd即可,Mac用户可以配置一个全局变量,由于我的系统版本是10.15,这里我就写zsh的配置方法了。


1.打开终端

2.打开 ~/.zshrc文件(如果无,则自动新建)

命令:


// 打开 ~/.zshrc文件(如果无,则自动新建)
open ~/.zshrc

3.设置环境变量

export PATH=${PATH}:/Users/zhujiang/Library/Android/sdk/platform-tools

4.保存并退出编辑

5.刷新环境变量生效


source ~/.zshrc

到这里就都可以使用hprof-conv工具了,需要输入以下命令将你导出的hprof文件转换成mat-hprof文件,命令如下:


hprof-conv -z 导出的文件.hprof 转换文件-mat.hprof

完成之后会出现的转换的文件,接下来需要下载能分析MAT的工具,一般使用Memory Analyzer,下面是下载地址:


https://www.eclipse.org/mat/downloads.php

下载完毕后双击文件如果报错的话,这是eclipse的一个bug。


解决办法: 右键mat显示包内容,进入Contents->MacOS下面,会有一个MemoryAnalyzer的命令。


打开终端,进入此路径找到MemoryAnalyzer,运行以下命令:

./MemoryAnalyzer -data dump文件所在文件夹路径

这样即可启动成功:


20200219184735222.png


打开之后选择如下选项打开刚才转换完成的文件:


20200219184842746.png


打开之后选择我下面的选项,然后点击finish,如果出错别管它,继续进行:

20200219184953835.png



进入之后选择Overview,然后点击Histogram。

20200219185125262.png



之后就可以进入类的页面,可以在里面进行筛选:


20200219185225820.png


下面是筛选的方法:

20200219190245992.png



找见需要优化的类,按照下面的方法打开:20200219185418570.png


打开之后是如下的页面:

20200219185522106.png



发现有一个mContext持有活动的引用,导致活动无法销毁。找到原因之后进行解决,咱们需要短了它的引用链,使GC可以清理调它。代码不多,在活动的onDestory()中进行销毁就行。

public static void fixInputMethodManagerLeak(Context destContext) {
        if (destContext == null) {
            return;
        }
        InputMethodManager imm = (InputMethodManager) destContext.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm == null) {
            return;
        }
        String [] arr = new String[]{"mCurRootView", "mServedView", "mNextServedView"};
        Field f;
        Object obj_get;
        for (String param : arr) {
            try {
                f = imm.getClass().getDeclaredField(param);
                if (!f.isAccessible()) {
                    f.setAccessible(true);
                }
                obj_get = f.get(imm);
                if (obj_get instanceof View) {
                    View v_get = (View) obj_get;
                    if (v_get.getContext() == destContext) { // 被InputMethodManager持有引用的context是想要目标销毁的
                        f.set(imm, null); // 置空,破坏掉path to gc节点
                    } else {
                        // 不是想要目标销毁的,即为又进了另一层界面了,不要处理,避免影响原逻辑,也就不用继续for循环了
                        break;
                    }
                }
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
    }


好了,这就是一个简单的内存泄漏问题。如果你的页面中有其他页面没有销毁,那就证明你的页面存在内存泄漏,就需要来这样进行查看。使用Mat工具方法有很多,大家可以多搜索一下。先到这里吧。



目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1671 4
|
存储 前端开发 Java
Android MVVM架构模式下如何避免内存泄漏
Android采用MVVM架构开发项目,如何避免内存泄漏风险?怎样避免内存泄漏?
635 1
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
541 21
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
468 33
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
615 31
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
358 5
|
缓存 数据库 Android开发
安卓开发中的性能优化技巧
【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
446 3
|
存储 缓存 监控

热门文章

最新文章