android 内存回收及怎样避免内存泄露

http://blog.vunso.com/201307/android%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6%E5%8F%8A%E7%A8%8B%E5%BA%8F%E4%BC%98%E5%8C%96system-gc.htm

android垃圾回收机制及程序优化System.gc

1.垃圾收集算法的核心思想

  对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。

2.触发主GC(Garbage Collector)的条件

  ①当应用程序空闲时,即没有应用线程在运行时,GC会被调用。

  ②Java堆内存不足时,GC会被调用。

3.减少GC开销的措施

  (1)不要显式调用System.gc()

  (2)尽量减少临时对象的使用

  (3)对象不用时最好显式置为Null

  (4)尽量使用StringBuffer,而不用String来累加字符串(详见blog另一篇文章JAVA中String与StringBuffer)

  (5)能用基本类型如Int,Long,就不用Integer,Long对象

  (6)尽量少用静态对象变量

  (7)分散对象创建或删除的时间

  其实这个gc()函数的作用只是提醒虚拟机:程序员希望进行一次垃圾回收。但是它不能保证垃圾回收一定会进行,而且具体什么时候进行是取决于具体的虚拟机的,不同的虚拟机有不同的对策。不要频繁使用gc函数。

  

优先级的回收顺序是 Empty process、Background process、Service process、Visible process、Foreground process

要避免内存泄露,主要要遵循以下几点:

  第一:不要为Context长期保存引用(要引用Context就要使得引用对象和它本身的生命周期保持一致)。

  第二:如果要使用到Context,尽量使用ApplicationContext去代替Context,因为ApplicationContext的生命周期较长,引用情况下不会造成内存泄露问题

  第三:在你不控制对象的生命周期的情况下避免在你的Activity中使用static变量。尽量使用WeakReference去代替一个static。

  第四:垃圾回收器并不保证能准确回收内存,这样在使用自己需要的内容时,主要生命周期和及时释放掉不需要的对象。尽量在Activity的生命周期结束时,在onDestroy中把我们做引用的其他对象做释放,比如:cursor.close()。

原文地址:https://www.cnblogs.com/hzwcoming/p/3740746.html