内存泄漏:指由于疏忽或错误造成程序未能释放已经不再使用的。
内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
Android中造成内存泄漏的原因有以下几点:
1、static activity
public class MainActivity extends AppCompatActivity {
private static MainActivity activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity=this;
}
}
其中 activity 是静态的,App在运行时会一直存在,现在错误的把它指向MainActivity,即造成MainActivity无法被GC回收,从而造成内存泄漏。
2、static view
public class MainActivity extends AppCompatActivity {
private static TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=findViewById(R.id.tv_1);
}
}
代码中TextVew 含有Context上下文,当Context 指向MainAcitivy时,就会造成MainActivity无法被回收,引起泄漏。
3、内部类
public class MainActivity extends AppCompatActivity {
private static InnerClass innerClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
innerClass=new InnerClass();
}
class InnerClass{
}
}
内部类含有对外部类的引用,从而造成内存泄漏
4、匿名类(AsyncTask、Handler、Thread等)
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(Void... voids) {
while (true){
}
}
}.execute();
匿名类含有对外面类的引用,如果后台任务还没执行完成、或者队列中还有任务没执行,即造成内存泄漏。
网友评论