Android的垃圾回收与内存泄露

在谈内存泄露之前,我们先谈一谈android的垃圾回收机制。


垃圾,即没有利用价值的东西。程序在运行时,需要对象来执行,这些对象都会占用内存空间。那么,当这些对象没有了利用价值,变成了垃圾,我们该如何对其进行回收?

这里,可以参看我的另一篇文章  JVM虚拟机以及垃圾回收机制学习总结

Android中使用的是Dalvik虚拟机,其使用的垃圾回收算法是Mark&Sweep,标记-清理算法。


如果这些垃圾不能被及时回收,就会造成内存泄露。

其实在Android中会造成内存泄露的情景无外乎两种:
  • 全局进程(process-global)的static变量。这个无视应用的状态,持有Activity的强引用的怪物。
  • 活在Activity生命周期之外的线程。没有清空对Activity的强引用。

检查一下你的项目中是否有以下几种情况:

  • Static Activities
  • Static Views
  • Inner Classes
  • Anonymous Classes
  • Handler
  • Threads
  • TimerTask
  • Sensor Manager


详情可以参考

[译]Android内存泄漏的八种可能(上)

[译]Android防止内存泄漏的八种方法(下)

[Android]Context泄露之谜:Handle & 内部类


下面推荐一款Android中检测内存泄露的工具:square公司推出的一款简单粗暴的检测内存泄漏的工具-- LeakCanary

下面的用法展示转自 http://www.open-open.com/lib/view/open1450669901261.html

上图就是LeakCanary的图标。当程序在debug的时候便会看见它了,但是当然release的时候就看不见了。

LeakCanary作为一个简单粗暴的工具,用法也相当简单

在build.gradle中引入LeakCanary

    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'  
        releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'  

一个是debug包,一个是release包的,从引入包的结构也能看出端倪

由于LeakCanary是测试整个app的内存泄露情况,所以你需要在你的application中启动它

    package com.zimo.guo;  
      
    import android.app.Application;  
      
    import com.squareup.leakcanary.LeakCanary;  
      
    /** 
     * Created by zimo on 15/8/7. 
     */  
    public class MyApplication extends Application {  
      
        @Override  
        public void onCreate() {  
            super.onCreate();  
            LeakCanary.install(this);  
        }  
    }  

ok,现在就可以测试程序中的内存泄露情况,直观明了

这么有逼格的工具,赶紧来试试吧,要想使你的app的内存泄露灰飞烟灭,try it




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Android 中,可以使用 `System.gc()` 方法来主动触发一次垃圾回收,具体代码如下: ```java System.gc(); ``` 但是需要注意的是,这只是对系统的一个建议,不能保证系统会立即执行垃圾回收。因为系统会根据需要自动调整垃圾回收的时间,确保系统的稳定性和性能。如果你频繁地手动调用垃圾回收,反而会影响系统的性能。 在应用程序的常规操作中,不应该频繁地手动触发垃圾回收。因为这可能会导致性能问题。如果您的应用程序需要频繁地创建和销毁对象,可以考虑使用对象池等技术来减少垃圾回收的频率。 总之,建议在大多数情况下,不要手动触发垃圾回收,让系统自动管理垃圾回收即可。 ### 回答2: Android 是一种基于 Linux 内核的开放源代码移动操作系统,其内置自带了垃圾回收机制来管理内存。Android垃圾回收器是一个主动进行垃圾回收的机制,它使用了一种叫做分代式垃圾回收(Generational Garbage Collection)的算法。 Android 系统中的垃圾回收器主要负责回收不再被使用的对象,以便释放内存空间供其他对象使用。具体来说,在Android 应用程序的运行过程中,垃圾回收器会定期扫描应用程序的堆内存,标记那些仍然被引用的对象,并且清除那些未被引用的对象。 Android垃圾回收器采用了分代式垃圾回收算法。这种算法将堆内存分为新生代和老年代两个部分。新生代主要存放那些存活时间短暂的对象,而老年代则存放那些存活时间较久的对象。垃圾回收器会根据对象的存活时间将它们分配到不同的堆内存区域,并在不同的时间点进行回收。 分代式垃圾回收器的工作原理如下:当新生代内存区域填满时,垃圾回收器会通过一种叫做 "复制" 的操作,将存活的对象从新生代区域拷贝到老年代区域。在此过程中,会同时进行对象的标记和清除操作。而老年代的回收则采用了更为复杂的算法,以避免对整个堆内存的扫描。 总的来说,Android垃圾回收器能够主动地监测和回收不再被引用的对象,从而提升内存的利用效率,并避免因为内存泄漏导致的系统崩溃或者性能下降。这个过程是在后台进行的,使得开发人员无需手动管理内存,从而更加专注于应用程序的开发和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值