1.mContext---

public class LoginActivity extends BaseActivity {
....
     /**初始化信息*/
     private void init() {
          DatabaseHelper.getInstance(this, GlobalVar.DB_NAME);//初始化数据库,复制数据库文件
          // 初始化屏幕数据
          Configuration.initDisplayMetrics(getWindowManager());
          SystemSettingHelper.initContext(this);    
          ...
          }
     .....
     }

----------------------------------------------------------------------------------------------------    
     public class DatabaseHelper extends SQLiteOpenHelper {
    
     private Context mContext;
     .....
     private DatabaseHelper(Context context, String name) { 
          super(context, name, null, VERSION);
          mContext = context;
          ..
          }
          ....
          public static final DatabaseHelper getInstance(Context context, String name){
          initDatabaseNames(context);
          copyDatabaseFile(context,name);
          return new DatabaseHelper(context,name); 
     }
     ....
     }
----------------------------------------------------------

public class SystemSettingHelper {
private static Context mContext = null;
    
     public static final void initContext(Context context){
          mContext = context;
     }
     .....
    
}

 
 
今天,看到一段,内存泄漏的代码。
 
static类型的变量,是类的类型信息。
一个虚拟机实例,当访问一个类的静态方法,或者实例化一个类的时候,虚拟机会首先加载类的类型数据(class data)。
类型数据,存放在方法区中。
 
一定出现内存泄漏的代码:
下述代码,传递指向LoginActivity对象的引用给SystemSettingHelper的静态方法initContext,
并且引用值,是作为SystemSettingHelper的静态变量存在的。
那么,根据GC_ROOT垃圾回收算法,mContext可以作为GC_ROOT,从GC_ROOT到LoginActivity对象存在一个可达路径。所以,LoginActivity对象是不会被回收的。
 
只有,当java虚拟机卸载类SystemSettingHelper时,才释放了对LoginActivity的引用。
 
登陆界面,一登陆完毕了;然后,就跳转到其他页面去了;然后,在资源不足的时候,系统就会回收不是处于onResume状态的Activity,比如LoginActivity。如此,系统调用了LoginActivity的onDestroy,但是,却垃圾收集却没有回收LoginActivity对象。如此,就不知道如何引用LoginActivity。
 
它存在,但是,我却找不到可以引用它的变量,也就是泄漏了。
 
public class LoginActivity extends BaseActivity {
....
     /**初始化信息*/
     private void init() {
          DatabaseHelper.getInstance(this, GlobalVar.DB_NAME);//初始化数据库,复制数据库文件
          // 初始化屏幕数据
          Configuration.initDisplayMetrics(getWindowManager());
          SystemSettingHelper.initContext(this);    
          ...
          }
     .....
     }
 
public class SystemSettingHelper {
private static Context mContext = null;
    
     public static final void initContext(Context context){
          mContext = context;
     }
     .....
    
}
 
 
---------------------------------------------------
 
同样的分析,如果 public static final DatabaseHelper getInstance(Context context, String name)
返回值,作为某个类的静态变量的值,那么,同样是会出现内存泄漏。
 
     public class DatabaseHelper extends SQLiteOpenHelper {
    
     private Context mContext;
     .....
     private DatabaseHelper(Context context, String name) { 
          super(context, name, null, VERSION);
          mContext = context;
          ..
          }
          ....
          public static final DatabaseHelper getInstance(Context context, String name){
          initDatabaseNames(context);
          copyDatabaseFile(context,name);
          return new DatabaseHelper(context,name); 
     }
     ....
     }
 
 
解决办法:
将上述的context,换位ApplicationContext。一个应用,有一个ApplicationContext,它指向的是应用的Application对象。
这个对象会一直存在着,直到应用销毁。
 
如此,就可以避免发生LoginActivity对象泄漏的情况。
 
 
---------------------Java虚拟机卸载已经加载到方法区的类的时机----------------------------------
 
引用自:http://blog.csdn.net/zhengzhb/article/details/7331354
  • 该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
  • 加载该类的ClassLoader已经被回收。
  • 该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

static变量与context泄漏的更多相关文章

  1. 局部变量存储区域静态变量存储区域static变量存储区域

    局部变量存储区域静态变量存储区域static变量存储区域 常见的存储区域可分为: 1.栈 由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 2.堆 ...

  2. Android开发中使用static变量应该注意的问题

    package com.highxin.launcher01; import java.util.ArrayList; import java.util.HashMap; import java.ut ...

  3. Android开发 静态static类与static方法持有Context是否导致内存泄露的疑问

    简述 在Android开发的过程中,难免会使用单例模式或者静态方法工具类.我们会让它们持有一些外部的Context或者View一般有以下几种情况: 单例模式,类的全局变量持有Context 或 Vie ...

  4. java中static变量和方法的总结

    转自:http://blog.csdn.net/haobo920/article/details/5921621 java中static变量和方法的总结 java中一切皆是对象 一个类中对象的定义一般 ...

  5. Asp.net中static变量和viewstate的使用方法(谨慎)

    在.Net平台下进行CS软件开发时,我们经常遇到以后还要用到某些变量上次修改后的值,为了简单起见,很多人都习惯用static来定义这些变量,我也是.这样非常方便,下一次调用某个函数时该变量仍然保存的是 ...

  6. ecmall中static变量的使用-model模型代码设计

    function &m($model_name, $params = array(), $is_new = false) { static $models = array(); $model_ ...

  7. objective-c static变量的使用总结

    在java中,我们经常使用的是单例模式,这些设计模式在ios开发中也比较常用,最近也在考虑使用在ios开发中使用单例模式 在objective-c中,需要在.m文件里面定义个static变量来表示全局 ...

  8. 调整static变量初始化顺序的一个办法

    // wrap the LaunchDir variable in a function to work around static/global initialization order stati ...

  9. spring为什么不能注入static变量

    Spring 依赖注入 是依赖 set方法 set方法是 是普通的对象方法 static变量是类的属性 @Autowired private static JdbcTemplate jdbcTempl ...

随机推荐

  1. 福大软工1816:Alpha(8/10)

    Alpha 冲刺 (8/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1. 2. 展示GitHub当 ...

  2. [贪心经典算法]Kruskal算法

    Kruskal算法的高效实现需要一种称作并查集的结构.我们在这里不介绍并查集,只介绍Kruskal算法的基本思想和证明,实现留在以后讨论. Kruskal算法的过程: (1) 将全部边按照权值由小到大 ...

  3. iOS- 封装单例宏

    在项目中,我们需要全局只有一个实例,节省不必要的内存,这时我们就需要使用里单例生成对象. 这时把单例的代码封装成宏,就能方便我们下次使用了. 在.h .m里直接导入头文件,调用 传入类名即可! sin ...

  4. WCF面试精典题汇总

    1.WCF接口中的参数改名问题 在写WCF Web Service接口的时候,如果你对接口的参数名做改动的时候,一定要记住Update所有应用该Web service的客户端的Referrence,否 ...

  5. 关于houghlines函数角度问题的说明

    以上是opecv reference里面的说明. Image必须是8位单通道图(可以使灰度图.二值图.边缘图等) Rho:距离分辨率,一般为1 Theta:角度分辨率,一般为CV_PI/180 Thr ...

  6. 第51天:封装可视区域大小函数client

    一.client  可视区域     offsetWidth:   width  +  padding  +  border     (披着羊皮的狼)   clientWidth: width  + ...

  7. html5 js canvas中画星星的函数

    function drawStar(cxt, x, y, outerR, innerR, rot) { cxt.beginPath(); ; i < ; i++) { cxt.lineTo(Ma ...

  8. Properties 的list方法 直接将内容放到文本中

    Properties 的list方法 直接将内容放到文本中

  9. BZOJ 1004 Cards(Burnside引理+DP)

    因为有着色数的限制,故使用Burnside引理. 添加一个元置换(1,2,,,n)形成m+1种置换,对于每个置换求出循环节的个数, 每个循环节的长度. 则ans=sigma(f(i))/(m+1) % ...

  10. [Leetcode] jump game ii 跳跃游戏

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...