`
zcwfeng
  • 浏览: 106556 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

android防止内存溢出浅析(二)

 
阅读更多


上次讨论的 由于Bitmap引起的内存溢出相对比较容易发现,这次我们来看看相对比较难以发现的引起内存溢出的两种情况。

一,Context引起的内存溢出:
在Android平台上,长期保持一些资源的引用,造成一些内存不能释放,带来的内存泄露问题很多。比如Context。
android中的很多资源文件都需要一个Context引用来加载,如果这些资源没有被释放,那么Context的引用不为null,造成对应的Activity即使 调用了finish()但其占有的内存依然不能被释放。这是 因为在Java或者Android内存机制中,顶点的结点释放前必须保证其他对象没有调用才能被系统GC回收释放。我们来看一段代码:

SoundManager.getInstance(this).play(SoundManger.MAIN_BG_SOUND);

从这段代码可以看出,声音管理类是一个单例,它对于整个应用进程来说是全局的,在进入应用的时候创建这个单例直到应用结束,这个单例才会被释放。大家可以看到这个类在得到单例的时候需要传递一个Context对象作为参数,因为要利用Context来加载声音资源。这就导致如果当前Activity调用了finish()全依然不能被GC,因为声音管理类是全局的,它持有了当前Activity的应用,阻止了其被GC。 解决的办法是尽量使用全局的Context来加载资源。修改如下:

SoundManager.getInstance(this.getApplicationContext).play(SoundManger.MAIN_BG_SOUND);

2 , Thread 线程引起的内存溢出:

先看代码:

private class MyThread extends Thread
{
@Override
public void run()
{
super.run();
while(bFlag)
{
//do somthing
}
}
}
MyThread mThread = new MyThread();
mThread.start();

这端代码 在主线程里新开了一个线程,并且在线程里循环处理一些逻辑。问题在于 如果控制线程结束的bFlag如果在Activity销毁时没有置为 false 将会产生很严重的后果。线程的一个特点是生命周期的不可控。如果Activity销毁时,没有结束线程的运行,那么不仅阻止了Activity被GC,而且大大降低了程序的性能。假如,再重新进入这个Activity,那么又创建了一个死循环的线程,而之前的那个线程依然在运行,这样程序就会非常的卡。所以 一定要注意,销毁Activity时一定要结束线程。

总而言之,想要避免context 相关的内存泄漏 ,记住以下几点:
a.不要对activity 的context 长期引用( 一个activity 的引用的生存周期应该和activity 的生命周期相同)
b.试着使用关于application的 context 来替代和activity相关的context
c.如果一个acitivity 的非静态内部类的生命周期不受控制,那么避免使用它;使用一个静态的内部类并且对其中的activity 使用一个弱引用。解决这个问题的方法是使用一个静态的内部类,并且对它的外部类有一WeakReference,就像在ViewRoot中内部类W所做的就是这么个例子。

分享到:
评论

相关推荐

    Android防止内存溢出浅析.zip

    以下是对Android防止内存溢出的深入浅析: 1. **Android内存管理机制** - **Dalvik/ART虚拟机**:Android系统使用Dalvik或ART虚拟机执行应用程序,它们都有自己的内存管理策略。 - **堆内存**:Java对象主要存储...

    Android防止内存溢出浅析

    在Android开发中,防止内存溢出是一个至关重要的任务,因为Android设备的内存资源相对有限,尤其是在Dalvik虚拟机中,其最大堆大小通常只有16MB。本文将深入探讨Android平台上的内存管理机制,以及如何避免内存泄露...

    基于Android防止内存溢出浅析

    理解并正确处理Android组件(如Activity、Service)的生命周期是防止内存溢出的关键。当组件不再使用时,应及时释放资源,如关闭数据库连接,停止正在执行的后台任务,解除对其他对象的引用。 **使用WeakReference...

    Android应用源码之防止内存溢出浅析.zip项目安卓应用源码下载

    Android应用源码之防止内存溢出浅析.zip项目安卓应用源码下载Android应用源码之防止内存溢出浅析.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    防止内存溢出浅析

    7. **优化代码结构**:良好的编程习惯和设计模式有助于防止内存溢出。例如,遵循单一职责原则,避免循环引用,及时释放资源,使用Parcelable而非Serializable等。 8. **系统级别的优化**:了解Android系统的内存...

    安卓Android源码——防止内存溢出浅析.zip

    本资料"安卓Android源码——防止内存溢出浅析"将深入探讨如何在Android源码层面理解和预防内存溢出。 首先,了解Android内存结构是必要的。Android内存分为堆内存和栈内存,Java对象主要存储在堆中,而局部变量和...

    Android应用源码之防止内存溢出浅析.zip

    本资源"Android应用源码之防止内存溢出浅析"旨在深入探讨如何通过源码分析来避免这种问题。 一、Android内存管理基础 Android系统采用Dalvik虚拟机(在Android 5.0之后改为ART)执行应用代码,其内存管理基于垃圾...

    Android应用源码之防止内存溢出浅析-IT计算机-毕业设计.zip

    这个"Android应用源码之防止内存溢出浅析"的压缩包可能包含了示例代码,通过阅读和分析这些代码,你可以理解以上策略如何在实际项目中应用。例如,查看图片加载部分,是否使用了合适的解码选项;检查Activity的生命...

    应用源码之防止内存溢出浅析.zip

    本资料"应用源码之防止内存溢出浅析"旨在深入探讨Android应用中的内存优化,帮助开发者避免因不当使用内存导致的应用崩溃。以下是根据标题、描述和标签提炼的相关知识点: 1. **Java内存模型**:Java内存分为堆内存...

    安卓开发-防止内存溢出浅析.zip

    本篇将深入探讨如何防止安卓应用中的内存溢出,从内存泄漏、大对象分配、Bitmap处理等方面进行详细解析。 一、理解安卓内存管理机制 安卓系统采用Dalvik/ART虚拟机,基于垃圾收集(Garbage Collection,GC)的内存...

    Android编程内存溢出与防范方法浅析

    在Android编程中,内存溢出(Memory Leak)是一个常见的问题,尤其对于有限的移动设备资源而言,内存管理显得尤为重要。Android的Dalvik虚拟机虽然在内存管理上与Java虚拟机有相似之处,但由于其内存限制(通常是16...

    android源码包集合4

    zz-doctor中医大夫助理...防止内存溢出浅析.rar 飞行历 飞行模式 AirPlus.rar 飞行射击类游戏源码.rar 高仿 WIN8系统 磁贴点击下沉倾斜效果源码.zip 高仿基于android2.2(Froyo)的Contacts.zip 高仿多米音乐播放器.rar

    浅析安卓(Android)的性能优化

    3. 使用Bitmap时注意内存控制:Bitmap对象占用了大量内存,我们需要合理地加载、解码和复用Bitmap,使用BitmapFactory.Options来控制解码时的大小,避免一次性加载过大图像导致内存溢出。 4. 利用Android提供的内存...

    浅析KJFrameForAndroid框架如何高效加载Bitmap

    然而,由于内存限制,直接加载大尺寸的Bitmap可能导致内存溢出(OOM)异常,因此高效地加载和管理Bitmap至关重要。KJFrameForAndroid是一个开源的Android应用开发框架,它提供了一种优化的Bitmap加载策略来避免此类...

Global site tag (gtag.js) - Google Analytics