简述:
内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
今天主要讲的是内存泄漏,这个问题在开发中是挺常见的,因为避免不了的我们要使用到:单例,动画,广播,数据库操作,流的读写,EventBus等开源的消息发送框架,Handler使用,线程池的创建销毁,for循环.......等等。现在对以上的这些实例进行总结如下:
1.注册:像广播,以及自定义观察者的自定义工具或者开源工具,在Destrory时候进行反注册。
2.handle消息,网络:对于Handler的延迟消息,或者网络请求这种,在Destroy时候移除所有消息,网络请求的则取消请求。
3.流:对于数据库,I/O流 文件流等操作一定要在不用的时候关掉流。
4.线程:耗时操作要放在子线程中去,另外线程的创建个销毁是很消耗性能的,所以如果使用频繁的情况下,建议最好创建一个线程池,这个可以看Ansyctask源码的线程池的创建。
5.编写代码:内部类要是静态内部类,否则会隐式持有外部类导对象导致泄露。 for循环千万不要不停的new 新的对象,而是在for的外部创建一个对象引用,在for进行赋值使用。
6.单例:是和APP生命周期一样的,所以创建单利的时候不要传进去某个Activity之类的,否则会一直持有引用。
在开发代码时候就要考虑到这些问题,养成一个良好的代码习惯。说到这个代码习惯,个人感觉,如果是一个人开发一个小项目,代码规范即使不是那么的整洁影响也不是多大。但是如果项目很大,参与的人很多,使用的技术五花八门,同样的工具,封装等不统一,是很郁闷的,最后的结果就是鱼腩。所以,大的项目一开始的时候,几个比较大的架构就得搭建好,统一好。另外在开发的时候涉及到的公共的工具,封装之类的最好维护一个文档。跑偏了!