腾讯,头条,阿里,百度Android面试真题之内存优化

 

本文提供真实的面试问答,希望对你有所帮助

 

1问: 谈谈为什么要做内存优化

因为不做内存优化会有两个问题,一是触发系统的low memory killer,系统会将后台进程给杀掉,二是触发OOM,因为堆内存超出 heap size导致应用崩溃

 

2问: 用什么工具来分析内存

as自带的memory profile工具,可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配

优势是可以实时展示内存使用量,用于识别内存泄漏和抖动(可以通过强制GC来实现)

 

或采用 adb shell dumpsys meminfo

查看某apk的内存

adb shell dumpsys meminfo 包名

或者adb shell dumpsys meminfo pid

比如:查看com.duowan.mobile

adb shell dumpsys meminfo com.duowan.mobile

 

代码级别的可以用onTrimMemory() 回调,或者通过getMemoryInfo()方法来查询内存情况

 

3问: android内存管理机制:

 

分两个,一是系统的内存管理,

android是基于Linux内核的,Android 运行时 (ART) 和 Dalvik 虚拟机使用分页和内存映射来管理内存,这意味着应用修改的任何内存,无论修改的方式是分配新对象还是轻触内存映射的页面,都会一直驻留在 RAM 中,并且无法换出。要从应用中释放内存,只能释放应用保留的对象引用,使内存可供垃圾回收器回收

 

应用退出时仍会放在内存中,只不过存在一个LRU(最近最少使用)缓存里,当内存紧张时,系统会从最近最少使用的进程,并结合进程所占内存的大小来终止进程,这里也扯了一个进程优先级的概念,Android分了5个,前台-可见-服务-后台-空进程

 

对于linux系统来说,空闲的内存相当于浪费内存,所以Linux系统会尽量的利用内存

 

而对于每个Android应用来说他们都是运行在各自的虚拟机中的,每一个ART或Dalvik 应用作为一个独立的进程执行。跟Java虚拟机一样,属于一种托管内存环境,程序员不需要显示的进行内存的管理和回收,而由虚拟机的垃圾回收来处理

 

但是每执行一次垃圾回收也是会耗性能的,所以这里就要求我们做两件事,尽量减少不必要的内存分配与避免分配的内存无法进行回收,也就是我们经常说的内存泄漏

 

说到应用内的内存管理,就一定要谈虚拟机了,虚拟机分了5大区:

线程私有:虚拟机栈,程序计数器,本地方法栈

线程共享:堆区,方法区

而我们会打交道的是堆区

 

4问: android中常见的内存问题以及优化方案

 

1. 内存泄漏,本该被回收的对象因持有外部引用而导致无法被回收,常见的比如handler内部类,数据库查找后未关闭,context使用不当,bitmap未回收等

 

2. 不必要的内存占用:

 

如不必要用Service时采用了Service,因为系统会倾向于让此服务的进程始终保持运行状态,可以采用JobSchedule替代

 

使用优化后的数据容器,SparseArray

避免内存抖动

使用精简版的Protobuf

 

大家可以扫描进入Android面试经验与技术交流小程序,可以阅读更多包括腾讯,头条,阿里,百度等大厂的面试真题:

腾讯,头条,阿里,百度Android面试真题之内存优化_第1张图片

 

腾讯,头条,阿里,百度Android面试真题之内存优化_第2张图片腾讯,头条,阿里,百度Android面试真题之内存优化_第3张图片       腾讯,头条,阿里,百度Android面试真题之内存优化_第4张图片

 

你可能感兴趣的:(腾讯,头条,阿里,百度Android面试真题之内存优化)