記憶體洩漏學習筆記

2021-10-09 21:31:40 字數 1616 閱讀 1803

(memory leak,記憶體洩漏)

記憶體洩漏(memory leak)是指由於疏忽或錯誤造成了程式未能釋放掉不再使用的記憶體的情況。記憶體洩漏並非指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。

當乙個物件已經不需要再使用本該被**時,另外乙個正在使用的物件持有它的引用從而導致它不能被**,這導致本該被**的物件不能被**而停留在堆記憶體中,這就產生了記憶體洩漏。

只發生一次的小的記憶體洩漏可能不會被注意,但洩漏大量記憶體的程式或洩漏日益增多的程式可能會表現出各種徵兆:從效能不良(並且逐漸降低)到記憶體完全用盡。 更糟的是,洩漏的程式可能會用掉太多記憶體,以致另乙個程式失敗,而使使用者無從查詢問題的真正根源。 此外,即使無害的記憶體洩漏也可能是其他問題的徵兆。

(1)堆記憶體洩漏 (heap leak)。對記憶體指的是程式執行中根據需要分配通過malloc,realloc new等從堆中分配的一塊記憶體,再是完成後必須通過呼叫對應的 free或者delete 刪掉。如果程式的設計的錯誤導致這部分記憶體沒有被釋放,那麼此後這塊記憶體將不會被使用,就會產生heap leak.

(2)系統資源洩露(resource leak).主要指程式使用系統分配的資源比如 bitmap,handle ,socket等沒有使用相應的函式釋放掉,導致系統資源的浪費,嚴重可導致系統效能降低,系統執行不穩定。

因為記憶體洩漏是在堆記憶體中,所以對我們來說並不是可見的。通常我們可以借助mat、leakcanary等工具來檢測應用程式是否存在記憶體洩漏。

1、mat是一款強大的記憶體分析工具,功能繁多而複雜。

2、leakcanary則是由square開源的一款輕量級的第三方記憶體洩漏檢測工具,當檢測到程式中產生記憶體洩漏時,它將以最直觀的方式告訴我們**產生了記憶體洩漏和導致誰洩漏了而不能被**。

3、使用工具軟體boundschecker,boundschecker是乙個執行時錯誤檢測工具,它主要定位程式執行時期發生的各種錯誤。

由於單例的靜態特性使得其生命週期和應用的生命週期一樣長,如果乙個物件已經不再需要使用了,而單例物件還持有該物件的引用,就會使得該物件不能被正常**,從而導致了記憶體洩漏。

示例:防止單例導致記憶體洩漏的例項

記憶體洩露的問題其困難在於1.編譯器不能發現這些問題。2.執行時才能捕獲到這些錯誤,這些錯誤沒有明顯的症狀,時隱時現。3.對於手機等終端開發使用者來說,尤為困難。下面從三個方面來解決記憶體洩露:

第一,良好的編碼習慣,盡量在涉及記憶體的程式段,檢測出記憶體洩露。當程式穩定之後,在來檢測記憶體洩露時,無疑增加了排除的困難和複雜度。

使用了記憶體分配的函式,要記得要使用其想用的函式釋放掉,一旦使用完畢。

heap memory:

malloc\realloc ------ free

new \new ---------- delete \delete

globalalloc------------globalfree

要特別注意陣列物件的記憶體洩漏

mypointex *pointarray =new mypointex [100];

其刪除形式為: delete pointarray

resource leak :對於系統資源使用之前要仔細看起使用方法,防止錯誤使用或者忘記釋放掉系統資源。

C C 學習筆記 指標和記憶體洩漏

c語言真是既簡單又深奧,還挺意思 今天小夥伴又有什麼問題呢?為什麼在 裡,乙個node指標在malloc一段記憶體後,需要首先memset一下,並且free掉之後,還可以通過node指標訪問到裡面的內容?下面按照關鍵點來逐條分析 為什麼要memset一下 其實程式新申請的記憶體空間中,並不能保證空間...

記憶體洩漏和記憶體溢位 記憶體洩漏和記憶體溢位

記憶體洩漏 是指申請的記憶體空間使用完畢之後未 一次記憶體洩露危害可以忽略,但若一直洩漏,無論有多少記憶體,遲早都會被占用光,最終導致程式crash。因此,開發中我們要盡量避免記憶體洩漏的出現 記憶體溢位 是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用。通俗理解就是記憶體不夠用了,通常在執行大...

JVM學習筆記第49天 記憶體洩漏

也稱作 儲存洩漏 嚴格來說,只有物件不會再被程式用到了,但是gc又不能 它們的情況,才叫記憶體洩漏。實際情況,很多時候一些不太友好的實踐 或疏忽 會導致物件的生命週期變得很長,甚至導致oom,也可以叫做寬泛意義上的 記憶體洩漏 儘管記憶體洩漏並不會立刻引起程式崩潰,但是,一旦發生記憶體洩漏,程式中的...