本文提供真实的面试问答,希望对你有所帮助
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面试经验与技术交流小程序,可以阅读更多包括腾讯,头条,阿里,百度等大厂的面试真题: