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. DAY5敏捷冲刺

    站立式会议 工作安排 (1)服务器配置 对单词学习的记录储存 (2)数据库配置 单词学习记录+用户信息 燃尽图 燃尽图有误,已重新修改,先贴卡片的界面,后面补修改后燃尽图 代码提交记录

  2. 个人作业4 alpha阶段 个人总结

    一.个人总结 二.回答问题 三.再提问题 Q1:关于第三章过早优化 过早优化:既然软件是"软"的,那么它就有很大的可塑性,可以不断改进.放眼望去,一个复杂的软件似乎很多的模块都可以 ...

  3. C# 中的语法糖

    1.   using 代替了 try-catch-finally 因为之前是学 Java 的,在连接数据库或者进行文件读写操作时很自然的就使用了 try-catch-finally-,在 C# 中这样 ...

  4. change object keys & UpperCase & LowerCase

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

  5. ADO.NET中DataSet、DataTable、DataRow的数据复制方法

    DataSet 对象是支持 ADO.NET的断开式.分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个DataTable的数据或者复制另一个DataTabe中的数据 ...

  6. BZOJ 1797 最小割(最小割割边唯一性判定)

    问题一:是否存在一个最小代价路径切断方案,其中该道路被切断? 问题二:是否对任何一个最小代价路径切断方案,都有该道路被切断? 现在请你回答这两个问题. 最小割唯一性判定 jcvb: 在残余网络上跑ta ...

  7. IO模式

    二 IO模式 刚才说了,对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间.所以说,当一个read操作发生时,它会经历两 ...

  8. CentOS httpd服务(Apache)

    1.从ISO镜像安装,Apache 服务的软件包名称为 httpd #检查源配置[root@localhost media]# cat /etc/yum.repos.d/CentOS-Media.re ...

  9. BZOJ4516:[SDOI2016]生成魔咒——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4516 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一 ...

  10. BZOJ1926:[SDOI2010]粟粟的书架——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1926 https://www.luogu.org/problemnew/show/P2468 幸福幼 ...