關於記憶體洩漏和記憶體分析檢測的簡單描述

2021-08-07 11:59:33 字數 1578 閱讀 6239

一、記憶體洩漏

首先,解釋一下記憶體洩漏是什麼。大家都知道jvm記憶體結構中,分為了heap區和stack區。而我們寫程式過程中,經常使用到的物件,在jvm記憶體結構中被分為了兩部分來儲存:分別是引用和物件本身的內容。

如:integer a=new integer(3);在這個物件的使用中,a是引用,儲存在stack區,而物件本身的內容:new integer(3),則是儲存在了heap區(物件和陣列物件的元素都儲存在heap區中)。

即生成乙個物件便會占用乙個heap的空間,那麼我們的物件在什麼時候被jvm**掉呢?當然是物件沒有用的時候就被**掉了,而jvm中,判斷這個物件有沒用,是根據這個物件是否有引用指向來判斷。(jvm中使用有向圖的方式來描述,若乙個物件不可達,則沒有引用指向了,則可以被**)。也就是說,在記憶體足夠的情況下,如果乙個物件持有(強)引用,則永遠不會被**掉。這,就是記憶體洩漏的前提了。

而,如果我們在寫程式過程中,出現了,邏輯上這個物件a已經沒有用了,我們希望其被gc**掉,但這個物件a任然持有某個引用,導致gc無法對其進行**,這時,就發生了記憶體洩漏。簡單來說,就是理應被刪除掉的物件任然持有某個引用,則發生了記憶體洩漏。

一次記憶體洩漏是小事,但是如果經常發生記憶體洩漏,則遲早會因heap控制項不足,而引起記憶體溢位。這問題就很嚴重了。

引起記憶體洩漏的原因有很多,如list、map物件使用完之後沒有清除掉集合內容啊,乙個類持有了自己非靜態內部類的靜態引用啊,匿名內部類、執行緒週期大於外部類啊。。。等等。。。這裡就不一一枚舉了。

二、記憶體洩漏檢測

檢測記憶體洩漏的方法,我主要了解到以下兩種:

(1)使用mat工具檢測記憶體洩漏,大致步驟分為:

(2)使用leakcanary:

leakcanary能否在記憶體洩漏時即輸出記憶體洩漏的位置、物件等相關資訊。使得記憶體洩漏的檢測更加方便。需要在程式中使用leakcanary的相關庫的函式來進行檢測:

testacitivity extends activity

}

此時,若activity呼叫ondestory後任然持有應用。則logcat會列印相關日誌,通過日誌,即可知道**洩露了。

通過refwatcher.watch(someobj);也可監視someobj物件是否發生記憶體洩漏。

簡單分析一下leakcanary的執行過程。當我們呼叫watch函式監視某個物件時,refwatcher會對傳入的引數建立乙個weakreference,然後在androidwatchexecutor的後台執行緒中,檢測weakreference是否為空,如果不為空,則呼叫gc**一次。如果gc後弱引用物件任然存在,則說明記憶體洩漏,輸出hprof檔案。然後leakcanary再通過分析hprof檔案(這個過程很複雜),簡單說來,就是通過分析,找到弱引用最近的強引用,並將洩漏資訊傳給乙個service,通過service對資訊進行列印。

(3)看到還有一種比較粗略的檢查記憶體洩漏的方法,就是開啟ddms,觀察heap記憶體的大小,若對某個操作進行多次,執行、再取消的操作,若每次操作後,heap的占用記憶體都比上次多,則說明記憶體洩露了。但是具體在哪兒、哪個物件,只有自己去對**進行單步除錯,或者重新行走一遍**,才能知道了。

以上就是今天學習記憶體洩漏的總結。僅以此記錄一下。

qt記憶體洩漏檢測 qt 關於記憶體洩漏的檢測

qt 關於記憶體洩露的檢測 工具篇關於qt 記憶體洩露的檢測工具有很多種,一下挑幾種來說 1 檢測已分配資源,第乙個工具是乙個記憶體資源使用的 它只能在模擬器上進行除錯.可以使用快捷鍵來呼叫 按鍵 功能 ctrl alt shift a 顯示已分配堆單元的數量 ctrl alt shift b 顯示...

qt記憶體洩漏檢測 qt 關於記憶體洩漏的檢測

qt 關於記憶體洩露的檢測 工具篇關於qt 記憶體洩露的檢測工具有很多種,一下挑幾種來說 1 檢測已分配資源,第乙個工具是乙個記憶體資源使用的 它只能在模擬器上進行除錯.可以使用快捷鍵來呼叫 按鍵 功能 ctrl alt shift a 顯示已分配堆單元的數量 ctrl alt shift b 顯示...

記憶體洩漏檢測

一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般 最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的 reboot才會...