【Android性能优化面试题】 内存泄漏查找

158 阅读3分钟

内存泄漏查找 (酷我音乐)

这道题想考察什么?

  1. 是否了解android 内存泄漏产生的原因
  2. 是否了解内存泄漏的背景。

考察的知识点

  1. android内存泄漏产生的产生场景
  2. android 内存泄漏的触发机制
  3. android 内存泄漏的原因

考生应该如何回答

方式一、 在这里插入图片描述

把app的堆内存空间想成了一个杯子,内存就是里面的水。当你的app启动后,系统会分配给app一个堆空间,起始不会很大比如是32M(根据你的app启动时的内存申请为准)随着程序的运行对象的创建越来越多,系统不断加内存分配:32M -> 64M -> ,而GC回收则会定时扫描内存,发现不被引用的对象即可回收。

此时如果有某个Activity持有某个引用,在onDestroy时还不把这个引用设为null,那么返回进入退出这个界面,Activity就会创建很多次从而存在多个实例,导致堆内存直升不降!这就叫做内存泄漏。

方式二、当你的app在使用中莫名崩溃,如果是OOM那么会有如下日志:

在这里插入图片描述

ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
int heapSize = manager.getMemoryClass();
int maxHeapSize = manager.getLargeMemoryClass();
  • heapSize是设备分配给app的最大堆内存
  • maxHeapSize 是当配置了android:largeHeap="true" 才有的最大堆内存,一般是heapSize的2-3倍

方式三、用AndroidStudio自带的内存分析工具分析,点击Dump Java Heap:

img

会在代码区 生成当前时间点的 .hprof格式文件,里面当前的每个对象 内存占用情况,我们现在怀疑ViewDefectPhotoActivity 可能内存泄漏 看一下:ViewDefectPhotoActivity 确实占用了很高的内存 而且有8个实例化对象,足以证明它有内存泄漏,随便点击其中一个,发现都和EditDefectActivity的内部类 ShowEditDefectHelper有关。而且ShowEditDefectHelpe前面带有 黄蓝三角树 这个图标表示,他可以被GC访问到,也就是无法回收:

在这里插入图片描述

总结:

  • 如何知道你的app上限值heapSize是多少
  • 什么情况导致无法GC
  • 怎么复现是哪个界面内存泄漏。内存泄漏不是一眼就能看出来了,需要测试人员配合。当然还有一个办法就是facebook的开源库:leakcanary,具体使用我不多介绍了。它是一个apk安装在手机上可以直接列出内存泄漏的Activity,但是有一定误报几率。

详细关注公众号:Android老皮
还能解锁  《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路