您的位置:

Android Garbage Collection详解

一、androidgc时机

在Android中,GC主要是在不断创建对象过程中进行,比如代码中的new操作、activity的onCreate和onDestroy方法执行等。GC根据对象的使用状态来进行回收,当一个对象不再被引用,即没有任何变量指向该对象时,GC就可以回收它。

在非常限制资源的设备上,GC时机的合理选择比较重要,可以采用以下两种方式:

1、尽可能的避免不必要的对象创建。比如使用单例模式、对象池等方式。

2、手动调用System.gc()触发一次GC操作,在适当的时间进行垃圾回收,避免一次回收时间过长而导致性能问题。

二、androidgc回收机制

Android平台采用了基于标记-清除算法和标记-整理算法的垃圾回收策略。两种算法如下:

1、标记-清除算法

标记-清除算法包括两个阶段:标记和清除。在标记阶段,从根对象开始遍历,将所有活动对象标记;在清除阶段,遍历堆空间,将未标记的对象进行释放。标记-清除算法满足“空间换时间”的原则,但可能会出现内存碎片。为了解决内存碎片问题,Android平台采用了标记-整理算法。

2、标记-整理算法

标记-整理算法也包括标记和整理两个阶段。在标记阶段,依然是从根对象开始进行标记,将所有活动对象标记;在整理阶段,先将所有存活的对象全部向一端进行移动,再将末尾以后的空间全部释放。标记-整理算法消除了内存碎片,但增加了对象的移动和复制成本。

三、androidgc代码示例

public class MyActivity extends Activity {
    private Bitmap mBitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        // 创建bitmap对象
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_bitmap);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 显式释放bitmap对象
        if (mBitmap != null) {
            mBitmap.recycle();
            mBitmap = null;
        }

        // 手动调用一次GC操作
        System.gc();
    }
}

在上述代码中,我们在Activity销毁时手动调用了一次GC操作,同时对Bitmap对象做了显式的释放。这个做法可以有效地加速垃圾回收,防止内存泄漏。

四、androidgc注意事项

在使用Android平台时,我们需要特别注意以下问题:

1、GC不是万能的,不能过份依赖GC。尤其在需要优化性能的时候,尽量避免不必要的对象创建。

2、不能频繁调用System.gc()方法,因为这种操作会造成系统开销,影响性能。

3、不要忘记在适当的时候释放对象,避免内存泄漏。

4、在Android 5.0之后,ART取代了Dalvik作为官方运行时环境。ART会在应用启动时进行所有代码的预编译,因此GC的表现会有较大提升。

五、androidgc结语

Android平台的GC机制对于垃圾回收和内存管理都有着重要的作用。理解GC的机制和时机,以及遵循最佳实践,可以大大提高应用的性能和稳定性。