众所周知,在Java中有些对象的生命周期是有限的,当它们完成了特定的逻辑后将会被垃圾回收;但是,如果在对象的生命周期本来该被垃圾回收时这个对象还被别的对象所持有引用,那就会导致内存泄漏;这样的后果就是随着我们的应用被长时间使用,他所占用的内存越来越大。如下就是一个最常见简单的泄露例子(其它的泄露不再一一列举了):
public final class MainActivity extends Activity {
private DbManager mDbManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//DbManager是一个单例模式类,这样就持有了MainActivity引用,导致泄露
mDbManager = DbManager.getInstance(this);
}
}
可以看见,上面例子中我们让一个单例模式的对象持有了当前Activity的强引用,那在当前Acvitivy执行完onDestroy()后,这个Activity就无法得到垃圾回收,也就造成了内存泄露。
*内存泄露可以引发很多的问题,常见的内存泄露导致问题如下:
-
应用卡顿,响应速度慢(内存占用高时JVM虚拟机会频繁触发GC);
-
应用被从后台进程干为空进程(上面系统内存原理有介绍,也就是超过了阈值);
-
应用莫名的崩溃(上面应用内存原理有介绍,也就是超过了阈值OOM);
造成内存泄露泄露的最核心原理就是一个对象持有了超过自己生命周期以外的对象强引用导致该对象无法被正常垃圾回收;可以发现,应用内存泄露是个相当棘手重要的问题,我们必须重视。
*Context使用不当造成内存泄露;不要对一个Activity Context保持长生命周期的引用(譬如上面概念部分给出的示例)。尽量在一切可以使用应用ApplicationContext代替Context的地方进行替换(原理我前面有一篇关于Context的文章有解释)。
-
非静态内部类的静态实例容易造成内存泄漏;即一个类中如果你不能够控制它其中内部类的生命周期(譬如Activity中的一些特殊Handler等),则尽量使用静态类和弱引用来处理(譬如ViewRoot的实现)。
-
警惕线程未终止造成的内存泄露;譬如在Activity中关联了一个生命周期超过Activity的Thread,在退出Activity时切记结束线程。一个典型的例子就是HandlerThread的run方法是一个死循环,它不会自己结束,线程的生命周期超过了Activity生命周期,我们必须手动在Activity的销毁方法中中调运thread.getLooper().quit();才不会泄露。
-
对象的注册与反注册没有成对出现造成的内存泄露;譬如注册广播接收器、注册观察者(典型的譬如数据库的监听)等。
-
创建与关闭没有成对出现造成的泄露;譬如Cursor资源必须手动关闭,WebView必须手动销毁,流等对象必须手动关闭等。
-
不要在执行频率很高的方法或者循环中创建对象,可以使用HashTable等创建一组对象容器从容器中取那些对象,而不用每次new与释放。
-
避免代码设计模式的错误造成内存泄露。
转载于:https://my.oschina.net/u/3637221/blog/1512109
分享到:
相关推荐
确保在不再需要时断开这些引用,防止内存泄漏。可以使用弱引用(`WeakReference`)或软引用(`SoftReference`)来存储这些对象: ```java WeakReference<Activity> weakActivity = new WeakReference(activity); //...
内存泄露在Android开发中是一个非常重要的问题,因为它可能导致应用程序运行缓慢、消耗过多资源甚至崩溃。Android Studio提供了多种工具帮助...记住,良好的编程习惯和对内存管理的深入理解,是防止内存泄露的关键。
以下是对Android防止内存溢出的深入浅析: 1. **Android内存管理机制** - **Dalvik/ART虚拟机**:Android系统使用Dalvik或ART虚拟机执行应用程序,它们都有自己的内存管理策略。 - **堆内存**:Java对象主要存储...
因此,合理管理线程和对象生命周期对于防止内存泄漏至关重要。 在深入分析内存泄漏时,阅读《Android系统原理与开发要点详解》这样的资料会非常有帮助。这本书可能会涵盖内存管理的基础知识,如何使用系统提供的...
在Android应用程序开发中,内存泄漏是一个严重的问题,它可能导致应用性能下降、系统资源浪费甚至应用程序崩溃。虽然Java的垃圾收集器(GC)自动处理大部分内存管理,但在Android中,由于其特殊的生命周期和对Context...
在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多的内存,影响性能,甚至导致应用崩溃。本文将深入探讨Android内存泄漏的检测和排查方法,并通过一个锁屏内存泄漏的例子进行具体分析。 首先,...
7. **代码审查和测试**:定期的代码审查和充分的测试是防止内存泄漏的重要步骤。通过仔细检查代码,特别是涉及动态内存的部分,可以发现潜在的内存泄漏问题。 总之,检测C++中的内存泄漏是一个多方面的工作,涉及到...
为了防止内存泄露,开发者需要注意以下几点: - 尽量使用`getApplicationContext()`获取上下文,避免在静态变量或静态内部类中使用非静态外部成员变量。 - 对于内部类,使用弱引用来引用外部类的变量,并尽可能将其...
本篇文章将详细介绍如何在Android环境中搭建一个简单的MVP模型,并探讨防止内存泄漏的策略。 **一、MVP模式介绍** MVP模式主要由三部分组成:Model(模型)、View(视图)和Presenter(呈现者)。Model负责处理...
在Android开发中,防止内存溢出是一个至关重要的任务,因为Android设备的内存资源相对有限,尤其是在Dalvik虚拟机中,其最大堆大小通常只有16MB。本文将深入探讨Android平台上的内存管理机制,以及如何避免内存泄露...
3. 内存泄漏的监听器:如注册了BroadcastReceiver、ContentObserver等,若忘记在合适时机注销,将导致内存泄露。 4. 异步任务:AsyncTask或其他后台任务如果引用了Activity,当Activity结束时,任务仍在后台运行,...
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。然而,如果不正确地使用WebView,可能会...遵循最佳实践并持续优化,可以有效防止内存泄漏,提升应用的稳定性和用户体验。
2. 应用程序崩溃:如果内存泄露严重到耗尽了所有可用内存,操作系统可能会杀死该应用程序以防止系统整体崩溃。 3. 资源浪费:未被释放的内存无法被其他程序复用,造成系统资源的浪费。 4. 难以调试:内存泄露问题...
理解并正确处理Android组件(如Activity、Service)的生命周期是防止内存溢出的关键。当组件不再使用时,应及时释放资源,如关闭数据库连接,停止正在执行的后台任务,解除对其他对象的引用。 **使用WeakReference...
当一个对象不再被引用时,垃圾回收器(Garbage Collector, GC)会自动清理其占用的内存,以防止内存泄露。 Android的内存限制是针对每个应用的,不同的设备和Android版本有不同的内存限制。因此,开发者需要特别...
本文将深入探讨Android Volley与AsyncTask在处理网络请求时的内存管理差异,并着重分析Volley可能导致内存泄漏的问题。 首先,Volley是Google推出的一个网络通信库,其设计目标是快速、高效地处理网络请求。Volley...
在Android应用开发中,内存泄漏是一个非常重要的主题,因为它直接影响到应用的性能和用户体验。内存泄漏指的是程序在申请内存后,无法释放已申请的...记住,良好的编程习惯和对内存管理的理解是防止内存泄漏的关键。
3. **防止内存泄漏的策略**: - **合理使用引用**:避免使用强引用,适当地使用弱引用、软引用和虚引用,让对象在不再需要时能被垃圾回收。 - **及时关闭资源**:文件流、数据库连接等资源使用完毕后应立即关闭,...