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