1、静态变量引起内存泄露
静态变量从声明到程序退出才被销毁!
案例:
安卓activity的初始化了一个静态变量,当安卓横屏或者其他的导致activity重新加载,之前的静态变量实例化引用的是第一次创建的activity,导致他不能被回收!!!
解决:
当不需要某对象时,务必及时把它的引用从集合中清理掉。

2、使用Application的Context(生命周期)
前提:
Application Context的生命周期和应用的生命周期一样长,而不是取决于某个Activity的生命周期;
分析:
如果想保持一个长期生命的对象,并且这个对象需要一个Context,就可以使用Application对象。
可以通过调用Context.getApplicationContext()方法或者Activity.getApplication()方法来获得Application对象。
案例:

private static Resources mResources;  

@Override

protected void onCreate(Bundle state) {

super.onCreate(state);

if (mResources == null) {
     //---------(1):小结1的问题:第一次创建的activity未被回收
    // mResources = this.getResources();
    ///////=-------(2):Resources对象拥有的是Application对象的引用,若是创新创建activity,第一个被回收!
    mResources = this.getApplication().getResources();
    }
}

3、及时关闭资源(cursor/file/Bitmap)
前提:
创建该资源后,若是让系统回收,效率低,所以要控制回收!
解决的代码:

Cursor cursor = null;
try{
    cursor = mContext.getContentResolver().query(uri,null,null,null,null);
    if (cursor != null) {
        cursor.moveToFirst();
        // 处理数据
    }
} catch (Exception e){
    e.printStatckTrace();
} finally {
    //判断是否为空,否则回收
    if (cursor != null){
        cursor.close();
    }
}

Bitmap创建后,在没有使用后要及时调用recycle()释放内存!!!

4、对Adapter进行优化
背景:当listview的item条码多时,需要优化:
代码(适配器为每个item返回一个view):

//convertView是被缓存起来的List条目中的View对象
public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
if (convertView == null) {
      convertView = mInflater.inflate(R.layout.list_item, null);
      holder = new ViewHolder();
      holder.text = (TextView) convertView.findViewById(R.id.text);
      convertView.setTag(holder);
  } else {
      holder = (ViewHolder) convertView.getTag();
  }
  holder.text.setText("line" + position);
  return convertView;
}
private class ViewHolder {
  TextView text;
}

分析:
当ListView滑动的时候,getView可能会直接返回旧的convertView。这里使用了convertView和ViewHolder,可以充分利用缓存,避免反复创建View对象和TextView对象。

5、java代码的微优化:
(1)创建新的对象都需要额外的内存空间,要尽量减少创建新的对象。

(2)将类、变量、方法等等的可见性修改为最小。

(3)针对字符串的拼接,使用StringBuffer替代String。

(4)不要在循环当中声明临时变量,不要在循环中捕获异常。
for(int i : a)

( 5 ) 如果对于线程安全没有要求,尽量使用线程不安全的集合对象。

( 6 ) 使用集合对象,如果事先知道其大小,则可以在构造方法中设置初始大小。

( 7 ) 文件读取操作需要使用缓存类,及时关闭文件。

( 8 ) 慎用异常,使用异常会导致性能降低。

( 9 ) 如果程序会频繁创建线程,则可以考虑使用线程池。

其他:

Android 在framework控制CPU频率_静态变量