在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种原因,也许有不对的地方,若有不对,看客可在下面留言,必回复。