1. 什么是内存泄漏, 内存泄漏会导致什么问题?
指一个对象不再使用,本应该被回收,但由于某些原因导致对象无法回收,仍然占用着内存,这就是内存泄漏。
Java有一套自己的内存回收机制,但往往被一些不好的开发习惯导致对象无法回收,进而会使应用程序使用时间越长,内存占用率越高,超出系统给设置的阈值的时候就会造成OOM(Out Of Memory)内存溢出的问题。当应用切换到后台的时候,系统会优先回收内存占用率高的应用,造成应用的不稳定性(比如后台执行操作的时候直接被销毁了)
2. 内存泄漏产生的原因和解决方案
创建单例的时候引用Activity的Context,单例的周期和应用的周期一致,当Activity被销毁的时候,内存不会被回收。引用Application的Context即可解决
使用Thread+Hander或者AsyncTask进行耗时操作的时候,Activity被销毁的时候,耗时操作未完成,内存不会被回收,耗时操作完成时也会引起崩溃。在Activity销毁的时候,移除耗时操作
使用WebView的时候造成的内存泄漏,不同版本存在不同的问题。在Activity被销毁的时候,通过WebView的父布局移除WebView,或者开启新进程,在结束操作的时候直接System.exit(0)结束掉进程,但需要注意进程间的通讯
IO操作时,未关闭流,数据库操作时,未关闭游标
3. 如何检测内存泄漏
Square的开源库LeakCanary,内存泄漏时,会进行通知栏提醒
网友评论