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

2023-10-29  本文已影响0人  小城哇哇

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

这道题想考察什么?

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

考察的知识点

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

考生应该如何回答

方式一、


image-20220121205822023.png

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

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

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

image-20220121210140573.png
ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
int heapSize = manager.getMemoryClass();
int maxHeapSize = manager.getLargeMemoryClass();

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


image.png

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

image-20220121210404018.png

总结:


最后

有需要面试题的朋友可以关注一下哇哇,以上都可以分享!!!

上一篇下一篇

猜你喜欢

热点阅读