linux内存分配缺陷,Linux系统优化-内存错误分析
造成內存錯誤的樣例分析
例一:(釋放代碼段空間導致內存錯誤)
圖1 ?Coding
運行錯誤顯示:
圖2內存錯誤顯示
分析:如圖2所示運行后出現內存錯誤,free(): invalid pointer: 0x08048540 ***。打印出指針P的地址可以看出如圖3,P的地址發生了變化,通過malloc分配的指針P地址在堆區,但是經過字符串給P再賦值后,P的地址變成了代碼段存放的地址
圖3指針P的地址
圖4進程運行內存顯示
釋放了一個代碼段的內存就導致了內存的錯誤,并非堆內存。
樣例二(釋放沒有申請空間的指針導致內存錯誤)
圖5 Coding
內存錯誤顯示
圖6內存錯誤顯示
分析:如圖6所示,運行后內存錯誤顯示。如圖7所示聲明并定義一個char? *p,并未為其分配空間,打印P的地址可以看出位于第一個動態鏈接庫加載的地址處。改指針并未申請空間。
圖7指針P地址
圖8進程運行內存顯示
樣例三 (釋放已經釋放的指針)
圖9 Coding
圖10運行錯誤顯示
分析:錯誤提示double free corruption (fasttop):0x09303008,即釋放了一個已經釋放了的內存空間。
樣例四(釋放了棧空間變量)
圖11 ?Coding
圖12內存錯誤
分析:聲明了一個int指針,并將變量a的地址賦予P,然后釋放P的空間。由上圖分析可得,P的地址為0xbfe6ec5c,通過顯示的Memory map可以看出,p指向的是棧空間。由于free了棧空間,導致了內存錯誤。
內存泄露原因
內存泄露通常分為四類:(根據發生的方式)
1.常發性內存泄露。造成內存泄露的代碼會被多次執行,每次代碼被執行時都會導致一塊內存泄露。
2.偶發性內存泄露。造成內存泄露的代碼只有在某種特定環境或操作下才會發生。常發性和偶發性是相對的。對于特定的環境,偶發性也許就變成了常發性。所以測試環境和測試方法對檢測內存泄露至關重要。
3.一次性內存泄露。造成內存泄露的代碼只會被執行一次,或者由于算法上的缺陷,導致總會有一塊僅且只有一塊內存發生泄露
4.隱式內存泄露。程序在運行過程中不斷地分配內存,但是直到結束時候才釋放內存。確切地說這里并沒有發生內存泄露,因為程序最終釋放了所有申請的內存。但是對于一個服務器程序來說需要需要長時間連續不間斷運行,有時幾個月甚至幾年。如果不及時釋放內存可能會導致最終耗盡系統的所有內存。
堆內存優化
1.堆內存最小單位為16字節所以應盡量減少小塊內存的申請,避免內存浪費
2.調整M_MMAP_THRESHOLD,降低mmap的門檻,會降低內存空洞的風險,但也會增加系統調用,降低性能。
3.調整M_TRIM_THRESHOLD,減少堆頂連續內存門檻,釋放更多的堆頂內存。
總結
以上是生活随笔為你收集整理的linux内存分配缺陷,Linux系统优化-内存错误分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux怎么给所有用户安装软件,Lin
- 下一篇: linux ant脚本,linux下an