一、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的机制和时机,以及遵循最佳实践,可以大大提高应用的性能和稳定性。