android 内存泄露产生原因分析

在android开发过程中,代码不规范,有时候很容易就会遭到内存泄露的侵袭。内存泄露,就是该死不死,有些对象或引用,本该释放的时候,因为某些原因释放不掉就会造成内存泄露。注意本文所写内容仅为本人自己的理解,若有错误,欢迎批评指正。

1.静态变量
两种类型的静态变量,如果是纯数值型的静态变量不会引起内存泄露,如果是对象或者引用,如果在activity的生命周期结束前将其置位空,可能会引起内存泄露。
1>静态activity.

 static Activity mActivity;
 static Drawable mDrawableTest;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mActivity = this;
    if (mDrawableTest == null) {
        mDrawableTest = getResources().getDrawable(R.mipmap.ic_launcher);
    }
}

上述代码,mActivity变量赋给了运行中的activity,如果该activity在生命周期结束前不将静态变量mActivity置为空,则该变量一直指向运行中的activity,持有它,导致activity的生命周期被静态变量hold住了,导致释放不掉。正确的做法是在onDestroy时将activity置为空,activity=null,则静态变量mActivity不指向activity了,则activity就能释放掉了。继续看下文描述。

2>静态View.

 private static TextView view;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final TextView textView = (TextView) findViewById(R.id.tv);
    textView.setText("i am textview 2222222");
    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view = textView;

        }
    });
}

上述代码如果在onDestroy时未将view=null,则view持有textview,textview持有activity,导致activity释放不掉,导致内存泄露。跟上段代码的mDrawableTest不同,mDrawableTest不持有activity.继续看下文描述。

上述2种情况碰到过将静态变量置为空也出现过退出后,mat中 activity个数不为0的情况,非必现,此时no gc root.原因未知,大神若知,忘留言。

3.内部类和匿名内部类

内部类默认持有外部类的引用。我自己的经验是不是所有的内部类都会导致内存泄露,如果在外部类释放的时候,内部类仍有耗时操作时就会泄露外部类,导致外部类不能被回收。

4.第三方线程没有主动结束掉导致内存泄露。

以上总结的4种原因,也许有不对的地方,若有不对,看客可在下面留言,必回复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值