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. 第二十次ScrumMeeting会议

    第二十次Scrum Meeting 时间:2017/12/10 地点:新主楼1039 人员:蔡帜 王子铭 游心 解小锐 王辰昱 李金奇 杨森 陈鑫 赵晓宇 照片: 目前工作进展 名字 今日 明天的工作 ...

  2. Alpha 冲刺(1/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作,对多个目标检测及文字识别模型进行评估.实验,选取较 ...

  3. java—连连看-实现消除

    实现消除 1.Chess.java package Linkup; /** * 棋子封装类 * * @author laixl * */ public class Chess { // 图片的 状态 ...

  4. iOS- 利用UIImageView自己整了个不会说话的汤姆猫

    1.实现思路 先说说我实现它的主要思路,很简单,主要利用UIImageView连续动画播放,和按钮的点击事件,就可以完成了这么一个简单的不会说话的汤姆猫. 2.实现细节 2.1.加载本地字典里保存的本 ...

  5. 【week2】燃尽图

    燃尽图(burn down chart)是在项目完成之前,对需要完成的工作的一种可视化表示.燃尽图有一个Y轴(工作)和X轴(时间).理想情况下,该图表是一个向下的曲线,随着剩余工作的完成,“烧尽”至零 ...

  6. change object keys & UpperCase & LowerCase

    change object keys & UpperCase & LowerCase .toLocaleUpperCase(); && .toLocaleLowerCa ...

  7. 最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )

    Lasso回归模型,是常用线性回归的模型,当模型维度较高时,Lasso算法通过求解稀疏解对模型进行变量选择.Lars算法则提供了一种快速求解该模型的方法.Lars算法的基本原理有许多其他文章可以参考, ...

  8. 洛谷 [SCOI2010]股票交易 | 单调性DP

    题目链接 #include<cstdio> #include<algorithm> #include<cstring> #define N 2005 using n ...

  9. POJ 2728 Desert King | 01分数规划

    题目: http://poj.org/problem?id=2728 题解: 二分比率,然后每条边边权变成w-mid*dis,用prim跑最小生成树就行 #include<cstdio> ...

  10. POI 10.28

    [POI2015]KUR 不考虑构造原串再匹配 考虑开始位置满足什么条件才能匹配. 显然,开始位置确定,后面的字符都确定了. 而且,a,n互质,所以必然能遍历n的剩余系,从不同位置开始,初始的a*s+ ...