什么情况下会导致内存泄露
2016-10-12 17:02
281 查看
Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的可能是24M,当我们的内存占用超过了一定的程度后,就会出现OutOfMemory的错误。
下面说明几点可能导致内存泄露的原因,供大家参考。
1.对象内存过大
保存了多个好用内存过大的对象,造成内存超出限制。
2.资源释放
程序代码的问题,长期保持某些资源,如Context,Cursor,IO流的引用,资源得不到释放造成内存泄露。
3.static关键字的使用
static 是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例,就可能会造成内存的泄露。
针对static的解决方案:
应该尽量避免static成员变量引用资源耗费过多的实例,比如Context.
Context尽量使用ApplicationContext的生命周期比较长,引用它不会出现内存泄露。
使用WeakReference代替强引用。比如可以使用WeakReference<Context> mContext;
4.线程导致内存溢出
线程产生内存泄露的主要原因在于线程生命周期的不可控。如当我们切换横竖屏的时候,一般会重新创建Activity,老的Activity应该被销毁。但是此时我们在子线程中正在进行耗时的操作,老的Activity不会被销毁,这个时候就会出现内存泄露。
解决方案:
将线程的内部类,改为静态内部类。
在线程内部采用弱引用保存Context引用。
下面说明几点可能导致内存泄露的原因,供大家参考。
1.对象内存过大
保存了多个好用内存过大的对象,造成内存超出限制。
2.资源释放
程序代码的问题,长期保持某些资源,如Context,Cursor,IO流的引用,资源得不到释放造成内存泄露。
3.static关键字的使用
static 是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例,就可能会造成内存的泄露。
针对static的解决方案:
应该尽量避免static成员变量引用资源耗费过多的实例,比如Context.
Context尽量使用ApplicationContext的生命周期比较长,引用它不会出现内存泄露。
使用WeakReference代替强引用。比如可以使用WeakReference<Context> mContext;
4.线程导致内存溢出
线程产生内存泄露的主要原因在于线程生命周期的不可控。如当我们切换横竖屏的时候,一般会重新创建Activity,老的Activity应该被销毁。但是此时我们在子线程中正在进行耗时的操作,老的Activity不会被销毁,这个时候就会出现内存泄露。
解决方案:
将线程的内部类,改为静态内部类。
在线程内部采用弱引用保存Context引用。
相关文章推荐
- 什么情况下会导致内存泄露
- Android中什么情况下会导致内存泄露
- 什么情况下会导致内存泄露
- 什么情况下会导致内存泄露
- 什么情况下会导致内存泄露
- Android系统中GC什么情况下会出现内存泄露呢?
- Android系统中GC什么情况下会出现内存泄露呢?
- Android系统中GC什么情况下会出现内存泄露?
- . Android系统中GC什么情况下会出现内存泄露呢?
- 内存泄露情况探究
- opencv各种内存泄露情况的总结
- opencv各种内存泄露情况的大总结
- 内存泄露 是什么
- .net2.0中的FileSystemWatcher会导致内存泄露
- malloc函数的使用以及内存泄露情况
- 常见的内存泄露情况
- Javascript中出现内存泄露的主要原因是什么
- java内存泄露,在什么地方最有可能出现内存泄露?
- new/delete和malloc/free的区别,并说说你在什么情况下会自另行建立自己的内存分配。
- 使用EXIT(0) 直接退出后,出现内存泄露情况