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. java通过控制鼠标实现屏幕广播

    在java实现屏幕共享的小程序中提到截取屏幕时是没鼠标,为了看到教师端界面上的鼠标,可以在截取屏幕的时候,把鼠标绘制到每一张截图上去,但是由于截图的时候是一张张截取的,所以看到的鼠标难免会有点卡,之前 ...

  2. 20172330 2017-2018-1 《Java程序设计》第五周学习总结

    20172330 2017-2018-1 <Java程序设计>第五周学习总结 教材学习内容总结 第五章 首先是对各种各种运算符的了解:刚开始以为相等就是=,还有其他一些符号都挺简单的,然后 ...

  3. UVALive - 6872 Restaurant Ratings 数位dp

    题目链接: http://acm.hust.edu.cn/vjudge/problem/113727 Restaurant Ratings Time Limit: 3000MS 题意 给你一个长度为n ...

  4. android仿系统Launcher界面,实现分屏,左右滑动效果(ViewSwitcher)

    ViewSwitcher代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitche ...

  5. 使用协程(gevent)实现请求

    协程,又称微线程.英文名Coroutine. 协程最大的优势就是协程极高的执行效率.因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就 ...

  6. lambda 分组练习

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } List<Person> per ...

  7. 【Python】python-内置常量

    引言 Python的内置常量不多,只有6个,分别是True.False.None.NotImplemented.Ellipsis.__debug__ 一.True 1.True是bool类型用来表示的 ...

  8. xsy1436-括号游戏

    题目 递归定义括号序列: 空串是括号序列 (A)是一个括号序列,其中A为括号序列 AB是一个括号序列,其中A,B均为括号序列 定义严格括号序列为形如(A)的括号序列,其中A为括号序列. 给出一个长度为 ...

  9. Python 日志输出中添加上下文信息

    Python日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如: ...

  10. Python 源码剖析(四)【LIST对象】

    四.LIST对象 1.PyListObject对象 2.PyListObject的创建与维护 3.PyListObject 对象缓冲池 4.Hack PyListObject 1.PyListObje ...