Thread 記憶體洩露

2021-06-29 14:58:52 字數 1442 閱讀 5876

執行緒也是造成記憶體洩露的乙個重要的源頭。執行緒產生記憶體洩露的主要原因在於執行緒生命週期的不可控。
public class threadactivity extends activity 

private class mythread extends thread

}private void dosomthing()

}這段**很平常也很簡單,是我們經常使用的形式。

我們思考乙個問題:假設mythread的run函式是乙個很費時的操作,當我們開啟該執行緒後,將裝置的橫屏變為了豎屏,

一般情況下當螢幕轉換時會重新建立activity,按照我們的想法,老的activity應該會被銷毀才對,然而事實上並非如此。

由於我們的執行緒是activity的內部類,所以mythread中儲存了activity的乙個引用,當mythread的run函式沒有結束時,

mythread是不會被銷毀的,因此它所引用的老的activity也不會被銷毀,因此就出現了記憶體洩露的問題。

靜態內部類:切斷activity 對於 mythread的強引用。

弱引用: 切斷mythread對於activity 的強引用。

有些人喜歡用android提供的asynctask,但事實上asynctask的問題更加嚴重,

thread只有在run函式不結束時才出現這種記憶體洩露問題,然而asynctask內部的實現機制是運用了threadpoolexcutor,

該類產生的thread物件的生命週期是不確定的,是應用程式無法控制的,

因此如果asynctask作為activity的內部類,就更容易出現記憶體洩露的問題。

**如下:

/**

* * 弱引用

*/public abstract class weakasynctaskextends asynctask

@override

protected final void onpreexecute()

}@override

protected final result doinbackground(params... params) else

}@override

protected final void onpostexecute(result result)

}protected void onpreexecute(weaktarget target)

protected abstract result doinbackground(weaktarget target,

params... params);

protected void onpostexecute(weaktarget target, result result)

}

記憶體洩露檢測

c 中檢測記憶體洩漏可以引入系統定義的巨集來檢視,內存在哪個位置洩漏 檔案開始處加入下列定義 define crtdbg map alloc include include 程式退出時加入以下函式 crtdumpmemoryleaks 如果有洩漏會顯示 記憶體洩漏是程式設計中常常見到的乙個問題,我所...

檢測記憶體洩露

程式結束時,作業系統會 程式占用的資源.但是,只要程式還在執行,如果不進行清理,資源最終可能被耗盡.1.vc記憶體洩露檢查工具 visual leak detector 現在已知的最新有2.0版本的,使方法不詳。使用 visual leak detector 2.2.3 在vs工程的linker i...

記憶體洩露檢測

1 包含標頭檔案 include include 2 每個cpp檔案包含 static char this file file define new new normal block,this file,line 3 設定標誌 int tmpdbgflag tmpdbgflag crtsetdbgf...