一 .java内存泄漏基础知识

  1. java内存的分配策略: a. 静态存储区. b. 栈分配 C.堆分配.
  2. java如何管理内存:new , GC 完成.
  3. java中的内存泄漏: 内存泄漏是指无用对象(不再使用的对象)持续咱有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄漏

二 .android中的内存泄漏

  1. 单列模式: 单列模式时因为是静态对象且生命周期是app的生命周期,所以在引用context的时候,不能使用Activity的 context. 应该使用context.getApplicationContext() app的context. 如果使用Activity作为单列模式的context,那么在回收Activity时候,由于静态的对象持有Activity的引用,所以Activity得不到回收.
  2. 匿名内部类: 非静态的内部类间接的引用了外部类, 修改方法把内部类修改成静态的内部类.

    // static class TestResource {

    // private static final String TAG = "";

    // //...

    // }

  3. Handler:

    //    private Handler mHandler = new Handler\(\) {
    
    //        @Override
    
    //        public void handleMessage\(Message msg\) {
    
    //            //...
    
    //        }
    
    //    };
    
    这种写法也是非静态的内部类间接的对外部内进行了引用,同时如果message循环里面还有未处理完的消息,那么就可能造成内存泄漏.
    
     修改成如下方法:
    

    内部修改成静态内部类,同时内部类持有外部内的弱引用,再Activity onDestory的时候remove 消息.

  4. 避免使用static变量: static变量的生命周期是和app的生命周期一样的,所以尽量少用static变量,减少内存的使用。如果在内存紧张的情况下,系统会优先的杀死那些后台占用内存大的APP.

  5. 资源未关闭造成的内存泄漏: cursor, 文件资源.

  6. AsyncTask造成的内存泄漏:

     同Handler一样,修改成静态的内部类,在Activity的onDestory时候调用cancel方法.
    
    1. Bitmap的时候,C部分内存,调用recycle方法。

results matching ""

    No results matching ""