您当前的位置:首页 > 养生 > 内容

什么是内存泄露内存泄露如何解决?什么是内存泄漏

引用它不会 出现内存泄露的问题,什么是内存泄露内存泄露如何解决1、内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,是指程序在申请内存后,内存溢出和内存泄漏分别是什么意思内存溢出与泄露的区别:一、内存溢出 out of memory,哪些情况会内存泄漏1、资源释放问题,当内存泄露严重时会导致OOM,(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏,因此它所引用的老的 Activity 也不会被销毁。

什么是内存泄露内存泄露如何解决

1、内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。

2、一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的,

使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆

中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则

这块内存就不能被再次使用,就是这块内存泄漏了。

3、内存泄露多数属于程序本身设计问题,有以下几种解决方法:

1)从程序内部重新编译。养成良好的编码习惯,尽量在涉及内存的程序段,检测出内存泄露。

2)结束程序,内存自然就会被操作系统回收。

3)重新启动电脑后,立刻恢复。

什么是内存泄漏

内存泄漏内存泄漏也称作“存储渗漏“,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干“,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏“是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。

哪些情况会内存泄漏

1、资源释放问题。 Android 程序代码的问题,长期保持某些资源,如 Context、Cursor、IO 流的引用,资源得不到释放造成内存泄露。2、对象内存过大问题保存了多个耗用内存过大的对象(如 Bitmap、XML 文件),造成内存超出限制。3、static 关键字的使用问题static 是 Java 中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所 以用 static 修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(Context 的情况最 多),这时就要谨慎对待了。public class ClassName { private static Context mContext; //省略 }11以上的代码是很危险的,如果将 Activity 赋值到 mContext 的话。那么即使该 Activity 已经 onDestroy,但是由 于仍有对象保存它的引用,因此该 Activity 依然不会被释放。我们举 Android 文档中的一个例子。private static Drawable sBackground;@Override protected void onCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); //getApplicationContext label.setText(“Leaks are bad“); if (sBackground == null) { sBackground = getDrawable(R.drawable.large_bitmap); } label.setBackgroundDrawable(sBackground); setContentView(label);} 123456789123456789sBackground 是一个静态的变量,但是我们发现,我们并没有显式的保存 Context 的引用,但是,当 Drawable 与 View 连接之后,Drawable 就将 View 设置为一个回调,由于 View 中是包含 Context 的引用的,所以,实际 上我们依然保存了 Context 的引用。这个引用链如下: Drawable-》TextView-》Context 所以,最终该 Context 也没有得到释放,发生了内存泄露。针对 static 的解决方案① 应该尽量避免 static 成员变量引用资源耗费过多的实例,比如 Context。② Context 尽量使用 ApplicationContext,因为 Application 的 Context 的生命周期比较长,引用它不会 出现内存泄露的问题。 ③ 使用 WeakReference 代替强引用。比如可以使用 WeakReference mContextRef;4、线程导致内存溢出线程产生内存泄露的主要原因在于线程生命周期的不可控。我们来考虑下面一段代码。。 public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new MyThread().start(); } private class MyThread extends Thread{ @Override public void run() { super.run(); //do somthing while(true) } } } 12345678910111213141234567891011121314这段代码很平常也很简单,是我们经常使用的形式。我们思考一个问题:假设 MyThread 的 run 函数是一个很费 时的操作,当我们开启该线程后,将设备的横屏变为了竖屏,一 般情况下当屏幕转换时会重新创建 Activity,按照我 们的想法,老的 Activity 应该会被销毁才对,然而事实上并非如此。 由于我们的线程是 Activity 的内部类,所以 MyThread 中保存了 Activity 的一个引用,当 MyThread 的 run 函 数没有结束时,MyThread 是不会被销毁的,因此它所引用的老的 Activity 也不会被销毁,因此就出现了内存泄露的 问题。有些人喜欢用 Android 提供的 AsyncTask,但事实上 AsyncTask 的问题更加严重,Thread 只有在 run 函数不结 束时才出现这种内存泄露问题,然而 AsyncTask 内部的实现机制是运用了 ThreadPoolExcutor,该类产生的 Thread 对 象的生命周期是不确定的,是应用程序无法控制的,因此如果 AsyncTask 作为 Activity 的内部类,就更容易出现内存 泄露的问题。针对这种线程导致的内存泄露问题的解决方案:第一、将线程的内部类,改为静态内部类(因为非静态内部类拥有外部类对象的强引用,而静态类则不拥有)。第二、在线程内部采用弱引用保存 Context 引用。

内存溢出和内存泄漏分别是什么意思

内存溢出与泄露的区别:

一、内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

二、内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

memory leak会最终会导致out of memory!

三、总结

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

内存泄漏是指本应该被GC回收的无用对象没有被回收,导致的内存空间的浪费,当内存泄露严重时会导致OOM。


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 条码打印机报价,东芝打印机都有什么型号(“复兴号”上的“宁夏元素”)

下一篇: win8软件下载(win8平板电脑怎么下载软件(除应用商店外))



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号