大家都知道内存泄漏和内存溢出是不一样的,内存泄漏所导致的越来越多的内存得不到回收的失手,最终就有可能导致内存溢出,下面说一下使用staitc属性所导致的内存泄漏的问题。

在dalvik虚拟机中,static变量所指向的内存引用,如果不把它设置为null,GC是永远不会回收这个对象的,所以就有了以下情况:

  1. public class SecondActivity extends Activity{
  2. private Handler mHandler = new Handler(){
  3. @Override
  4. public void handleMessage(Message msg) {
  5. super.handleMessage(msg);
  6. SecondActivity.this.finish();
  7. this.removeMessages(0);
  8. }
  9. };
  10. private static Haha haha;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. haha = new Haha();
  15. mHandler.sendEmptyMessageDelayed(0,2000);
  16. }
  17. class Haha{
  18. }
  19. }

非静态内部类的静态引用。然后在2秒之后我们要finish掉这个activity,会造成什么问题呢?我们知道,内部类和外部类之间是相互持有引用的,SecondActivity实例持有了haha的引用,但这里haha是用static修饰的,上面说了,虚拟机不会回收haha这个对象,从而导致SecondActivity实例也得不到回收,造成内存溢出。

这货还在这得不到回收。

怎么解决这个问题呢,很简单,只要在Activity的onDestroy方法里把haha设为null就行啦

  1. protected void onDestroy() {
  2. super.onDestroy();
  3. if(haha!=null){
  4. haha = null;
  5. }
  6. }

那么还有另外一种情况,单例的问题。单例也是用了其static属性,很多单例,往往需要用到context对象,而又是通过传值的方式获得,比如:

先来一个单例

  1. public class SingleInstanceF {
  2. private static SingleInstanceF single;
  3. private  Context context;
  4. private SingleInstanceF(Context context){
  5. this.context = context;
  6. }
  7. public static SingleInstanceF getInstance(Context context){
  8. if(single==null){
  9. single = new SingleInstanceF(context);
  10. }
  11. return single;
  12. }
  13. }

再来一个Activity来用它,context传入一个this,再2秒之后关闭Activity

  1. public class ThirdActivity extends Activity{
  2. private Handler mHandler = new Handler(){
  3. @Override
  4. public void handleMessage(Message msg) {
  5. super.handleMessage(msg);
  6. ThirdActivity.this.finish();
  7. this.removeMessages(0);
  8. }
  9. };
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. SingleInstanceF instanceF = SingleInstanceF.getInstance(this);
  14. mHandler.sendEmptyMessageDelayed(0,2000);
  15. }
  16. }

后来我们发现这货还在,又是得不到回收:

怎么办呢,还是像上面那样,把静态对象设置为null,或者我们传入context的时候,别传this了,this可是当前Acitvity啊,传Application Context即可。但是不是都可以传Application Context呢,明显不是,有的事是Application Context干不了的,这个得看具体情况而定。

最新文章

  1. 解决jeecg包升级之后无法启动的问题
  2. android—-线性布局
  3. win7下matplotlib安装(64位)
  4. uva 11380(最大流+拆点)
  5. MySQL DATE_SUB() 函数
  6. C#中调用存储过程
  7. makefile-0711-168 SEVERE ERROR: Input file:
  8. 用Hexo搭建属于自己的Blog
  9. 常用两种数据交换格式之XML和JSON的比较
  10. Firefox取消“订阅实时书签”功能
  11. Magento2.X 前端&综合 简要
  12. HDU 1088(文本处理 **)
  13. win32 汇编学习(2):消息框
  14. JQuery UI之Autocomplete(4)多值输入、远程缓存与组合框
  15. Python操作Saltstack
  16. 关于Storm 中Topology的并发度的理解
  17. sql server的远程连接
  18. getJSON获取JSON文件加载下拉框及动态验证比输入项
  19. 基于CDH,部署Apache Kylin读写分离
  20. ZOJ 3607 Lazier Salesgirl

热门文章

  1. vue之store中属性更新用法
  2. Spring 顾问
  3. ASPCTJ
  4. Python定时任务sched(一)
  5. 从0到1分步实现一个出生日期的正则表达式(JavaScript)
  6. php 根据周数获取当周的开始日期与最后日期
  7. centos7使用yum安装不了ffmpeg
  8. Outlook 2016 自动发送/接收无法正常工作
  9. Python+selenium之测试报告(1)
  10. Java 继承与重写