内存泄漏,首先要了解什么是引用,
其实也很好理解,如下列代码,新建对象B,B中包含A,B就拥有A的引用,
这时候,只要B存在,A就不会被销毁,
什么时候A会被销毁呢?给B对象set一个新的A,或者设置为null,旧的A就可以被销毁。
class A {
}
class B{
A a = new A();
public void setA(A a) {
this.a = a;
}
}
而内存泄漏问题,主要是对象没有及时清除。
例子一
类似于 while(true) 无限循环,这种情况下,线程不会停止,除非停掉应用程序,如果不断地给线程增加新的引用,内存占用就会越来越大。
(最常见的就是主线程,写着main函数的那个,只要你程序还在跑,这个函数就仍然在执行)
例子二
程序本身没问题,但是滥用内存,最简单的例子,就是把一整个文件读到内存。
你可能觉得不会有人这么傻,没事读取一整个文件,有些业务是不得已为之,像是分析图像文件,需要经常读取整个文件,这时候需要考虑算法方面的优化了。
例子三
一些易错程序的不规范的使用,例如:ThreadLocal、安卓中的Handler、线程池等等,本身就容易被错误使用,不过人家设计之初,就强调我们需要注意内存泄漏问题。
(其本质上还是线程不能停止,像是线程池,会回收线程重复使用,对于不能停止的线程,使用结束一定要注意置空对象引用)
例子四
静态类(工具类)、静态字段,static声明的对象会长期霸占内存,需要做好对象的管理工作。
进阶的优化方案
一般保持好良好的编码习惯,就不会导致内存泄漏。
必要的时候,可以使用 “弱引用” 和 “软引用”,简单地说,就是内存不足的时候,程序自动地,优先删除一些引用,不过这里就不具体展开说明了。
疯狂的妞妞:每一天做什么都好,不用什么都不做。