一、Java内存泄露
内存泄露( memory leak):是指无用对象(不再使用的对象)持续占有内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露。
一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,会提示你Out of memory,即造成内存溢出。
Java内存泄露根本原因:
长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。
内存泄漏的场景举例说明:
1)Android中如果要使用到Context,尽量使用ApplicationContext去代替Context,因为ApplicationContext的生命周期较长,引用情况下(短周期对象引用长周期对象)不会造成内存泄露问题。
2)android种线程显露,如handler以及AsyncTask导致的内存泄露
3)集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
----------像HashMap、Vector等的使用最容易出现内存泄露,这些变量如果是静态的,其生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。
例:
Static Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{
Object o = new Object();
v.add(o);
o = null;
}//
在这个例子中,循环申请Object 对象,并将所申请的对象放入一个Vector 中,如果仅仅释放引用本身(o=null),那么Vector 仍然引用该对象,所以这个对象对GC 来说是不可回收的。因此,如果对象加入到Vector 后,还必须从Vector 中删除,最简单的方法就是将Vector对象设置为null。
----------单例对象中的集合对象属性是不会被回收的,因此集合对象使用后一定要清空,否则无法释放
4)数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。