內(nèi)存泄漏:指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的娶吞。
內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后械姻,由于設(shè)計(jì)錯(cuò)誤妒蛇,導(dǎo)致在釋放該段內(nèi)存之前就失去了對(duì)該段內(nèi)存的控制,從而造成了內(nèi)存的浪費(fèi)楷拳。
Android中造成內(nèi)存泄漏的原因有以下幾點(diǎn):
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 是靜態(tài)的,App在運(yùn)行時(shí)會(huì)一直存在欢揖,現(xiàn)在錯(cuò)誤的把它指向MainActivity陶耍,即造成MainActivity無(wú)法被GC回收,從而造成內(nèi)存泄漏她混。
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上下文泊碑,當(dāng)Context 指向MainAcitivy時(shí),就會(huì)造成MainActivity無(wú)法被回收毯欣,引起泄漏馒过。
3、內(nèi)部類(lèi)
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{
}
}
內(nèi)部類(lèi)含有對(duì)外部類(lèi)的引用酗钞,從而造成內(nèi)存泄漏
4腹忽、匿名類(lèi)(AsyncTask、Handler砚作、Thread等)
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(Void... voids) {
while (true){
}
}
}.execute();
匿名類(lèi)含有對(duì)外面類(lèi)的引用窘奏,如果后臺(tái)任務(wù)還沒(méi)執(zhí)行完成、或者隊(duì)列中還有任務(wù)沒(méi)執(zhí)行葫录,即造成內(nèi)存泄漏着裹。