内存泄露与内存溢出
来源:互联网 发布:软件测试柠檬班靠谱吗 编辑:程序博客网 时间:2024/05/19 23:29
1、内存泄露(Memory Leak)
内存泄露是指我们在使用动态存储时分配的空间,在使用后没有释放,这样导致内存单元没有被回收利用,这就是内存泄露。
在java中因为动态创建的对象是保存在堆中的,因此指的是堆内存泄露。
内存泄露在不严重的情况下不容易察觉,但在严重的情况下会导致导常产生:Out of Memory(内存溢出)
在java中内存泄露的场景:
1、静态集合类引起内存泄露
Static Vector v = new Vector(10); for (int i = 1; i<100; i++) { Object o = new Object(); v.add(o); o = null; //o对象已经删除,但集合v没有办法被回收,从而可能引起内存泄露问题。}//
2、监听器
当我们给一个对象设置监听的时候,移除对象后,没有解除监听任务,导致内存泄露
3、没有关闭使用的资源
- 数据库连接
- 网络连接
- io流
2、内存溢出(Out of Memory)
内存溢出是指我给们程序分配的内存空间不足,导致内存溢出。在java中内存分配由程序完成,而内存的回收由GC(Garbarge Collection)管理。但GC只能回收无用不再被其他对象所占用的空间,而由于程序员调用不当导致的问题没有办法解决。因此,我们只有程序员良好的代码习惯,尽量释放不使用的内存空间。
通常导致内存溢出的原因
1、读取数据太大造成
比如从数据库中一次读取太多的内容,或者一次性给集合中添加特别多的内容。
2、集合中对象的引用,使用后没有清空
集合类中有对对象的引用,使用完后未清空,使得JVM不能回收
3、死循环
死循环可能直接导致内存溢出。
3、Android中内存溢出与内存泄露
Android由于分配的内存有限,这个问题就比java问题严重的多,稍有不当,便会产生OOM的导常。它产生的原因大致和java上述相同,但也有些android中比较特别的地方。内存泄露和内存溢出都可以导致OOM,因此可以从这两方面都进行分析。下面主要 列举在Android中产生内存溢出的场景
1、没有关闭使用的资源
和java中一样包括数据库,网络,IO流操作等。
2、静态变量使用不当
特别是activity中使用静态成员,导致 activity也没有办法回收
private static Drawable sBackground; @Override protected void onCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); label.setText("Leaks are bad"); if (sBackground == null) { sBackground = getDrawable(R.drawable.large_bitmap); } label.setBackgroundDrawable(sBackground); setContentView(label); }
3、Handler引起的内存泄露
public class MyActivity extends Activity { private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... } }}
在activity中使用handler,如果activity已经回收,则handler执行完毕,更新UI时,Activity已经销毁了。
解决办法:Handler使用静态内部类
4、图片问题
- 图片太大—–压缩
- 图片没有释放资源,Bitmap没调用recycle()
- Android中listview,recyclerview的优化问题,也就是图片缓存问题,三级缓存
5、集合中对象没清理造成的内存泄露
比如ArrayList,和Map中在清空数据。如果是static修饰的话,问题会更加严重。
4、最后Android中内存检测工具
- 内存泄露与溢出
- 内存泄露与内存溢出
- 内存溢出与内存泄露
- 内存泄露与内存溢出
- 内存泄露与内存溢出
- 内存溢出与内存泄露
- 内存泄露与内存溢出
- 内存泄露与内存溢出
- 内存泄露与溢出区别
- 内存泄露与溢出区别
- Linux内存泄露与溢出
- android:内存泄露与内存溢出区别、内存泄露定位
- JAVA内存泄露与内存溢出
- 内存溢出与内存泄露的区别
- 内存泄露与内存溢出总结
- JVM内存泄露与内存溢出
- 【Android高级】内存泄露与内存溢出
- java内存泄露与内存溢出
- usaco comehome
- c语言基础(3)--数据和c
- 不同特权级代码段之间的跳转
- 字符串的排序 接收一个字符串,对其中所有的字符窜进行排序,如:helloitcast,打印:acehillostt
- 为神马北大那个DNA是wrong answer 呢,哪里有问题求大神讲解啊
- 内存泄露与内存溢出
- SQL基础E-R图画法(二)
- 会话控制--php基础最详细教程
- Android中处理大图片时图片压缩
- 树状数组资料、
- 判断回文数
- 集合的排序 一个集合中存储无序元素 使其有序化(字典顺序) 不去重
- Qt 之 QQ系统表情(一)
- Android之Palette动态决定UI色彩风格