美文网首页
内存泄漏和内存溢出

内存泄漏和内存溢出

作者: zmy26 | 来源:发表于2022-08-31 20:42 被阅读0次

一、什么是内存泄漏和内存溢出:

1、内存泄漏(memory leak ):指程序申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存分配给其他程序使用。

2、内存溢出(out of memory):指程序申请内存时,没有足够的内存提供给申请者使用,导致无法正常存储到内存中。例如给了一个int类型的存储空间,却存储long型数据就会发生内存溢出。

二、两者关系和区别:

1.关系:内存泄露最终会导致内存溢出,由于系统中的内存是有限的,如果过度占用资源而不及时释放,最后会导致内存不足,从而无法给所需要存储的数据提供足够的内存,从而导致内存溢出。导致内存溢出也可能是由于在给数据分配大小时没有根据实际要求分配,最后导致分配的内存无法满足数据的需求,从而导致内存溢出。

2.区别:内存泄露是由于GC无法及时或者无法识别可以回收的数据进行及时的回收,导致内存的浪费;内存溢出是由于数据所需要的内存无法得到满足,导致数据无法正常存储到内存中。内存泄露的多次表现就是会导致内存溢出。

三、什么场景会引起内存泄漏

1、静态集合引起内存泄漏

      主要是hashmap,Vector等,如果是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。

2、observer 我们在使用监听器的时候,往往是addxxxlistener,但是当我们不需要的时候,忘记removexxxlistener,就容易内存leak

     广播没有unregisterrecevier

3、各种数据链接没有关闭,数据库contentprovider,io,cursor,sokect等

4、非静态内部类:

     java中的内部类(匿名内部类),会持有宿主类的强引用this。

所以如果是new Thread这种,后台线程的操作,当线程没有执行结束时,activity不会被回收。

5、单例:

     单例中的Context如果传的是Activity,则容易内存泄漏。解决办法使用Application

6、handler造成内存泄漏:

     /**

* Handler造成的内存泄露

*/

public class MainActivity extends AppCompatActivity {

private final Handler mLeakyHandler = new Handler(){

@Override

public void handleMessage(@NonNull Message msg) {

super.handleMessage(msg);

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mLeakyHandler.postDelayed(new Runnable() {

@Override

public void run() {

}

},1000*60 *10);

finish();

}

/**

* 造成这样的原因是:当Acvitity结束时,handler拿着acitivty的句柄,导致activity不会被释放

* 解决方案:

* 1 将handler声明为静态的

* 2 如果有activity的引用,通过弱引用的方式持有activity

*

*/

private MyHandler myHandler = new MyHandler(this);

private static class MyHandler extends Handler{

private WeakReference reference;

public MyHandler(Context context) {

this.reference = new WeakReference<>(context);

}

@Override

public void handleMessage(@NonNull Message msg) {

MainActivity activity = (MainActivity) reference.get();

if(activity != null){

}

}

}

@Override

protected void onDestroy() {

super.onDestroy();

myHandler.removeCallbacksAndMessages(null);

}

}

7、

相关文章

  • 【Android测试】内存泄漏检测 LeakCanary

    什么是内存泄漏和内存溢出?内存泄漏有什么危害?LeakCanary检测内存泄漏? 内存泄漏(Memory Leak...

  • 内存溢出和内存泄漏

    1.内存泄漏 2.内存溢出 -如何避免内存泄漏、内存溢出?

  • 使用 Memory Profiler 排查内存泄露

    使用 Memory Profiler 排查内存泄漏 内存泄漏和内存溢出 **Memory Profiler **是...

  • JVM

    1. 内存溢出和内存泄漏 内存溢出是说程序需要申请的内存超过了JVM当前可以分配的最大内存,溢出。内存泄漏是说期望...

  • 【JVM】内存溢出分析

    一 内存溢出概述 都有发生内存溢出异常(OutOfMemoryError,简称OOM)的可能。 内存溢出和内存泄漏...

  • iOS内存泄漏有哪些

    iOS内存溢出和内存泄漏的情况

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • 记一次面试

    内存泄漏和内存溢出 概念 内存泄漏:垃圾回收器无法回收原本应该被回收的对象,这个对象就引发了内存泄露。 内存溢出:...

  • android中内存泄漏

    内存泄漏和内存溢出的关系 内存泄漏: 是指申请空间后,在使用完后没有释放。 内存溢出: 程序向系统申请的内存超过了...

  • 优化

    1.内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法? 内存溢出通俗理解就是软件(应用)运行需...

网友评论

      本文标题:内存泄漏和内存溢出

      本文链接:https://www.haomeiwen.com/subject/ucadnrtx.html