一種嵌入式系統(tǒng)中內(nèi)存泄漏診斷處理的方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計算機(jī)技術(shù)應(yīng)用領(lǐng)域,具體涉及一種嵌入式系統(tǒng)中內(nèi)存泄漏診斷處理的方法和裝置。
【背景技術(shù)】
[0002]嵌入式系統(tǒng)是一種資源比較受限的系統(tǒng),因此如何高效復(fù)用有限的系統(tǒng)資源,特別是如何利用好有限的內(nèi)存資源,發(fā)揮最大運行效率,成為嵌入式系統(tǒng)性能的關(guān)鍵問題。
[0003]嵌入式系統(tǒng)中,大多數(shù)方案采用動態(tài)內(nèi)存管理方式,而所謂的動態(tài)內(nèi)存也就是及時申請內(nèi)存,用完及時釋放內(nèi)存,而在這個過程中經(jīng)常出現(xiàn)程序bug或者人員疏忽,導(dǎo)致內(nèi)存無法釋放,出現(xiàn)內(nèi)存泄漏問題,隨著系統(tǒng)長時間運行,內(nèi)存越用越少,最后無內(nèi)存可用,程序最終會因為沒有足夠內(nèi)存空間而無法正常運行,導(dǎo)致系統(tǒng)奔潰死機(jī),后果非常嚴(yán)重。因此,如何自動有效地準(zhǔn)確檢測內(nèi)存泄漏并合理釋放內(nèi)存是一個亟待解決的棘手難題。
[0004]以往,傳統(tǒng)的內(nèi)存泄漏檢測及處理方法,一是在調(diào)試或者測試階段,使用自動測試軟件通過對內(nèi)存進(jìn)行插粧,內(nèi)存使用情況被記錄到自動測試軟件的數(shù)據(jù)庫中,事后人為分析判斷是否存在內(nèi)存泄漏,并通過人工檢查方式對內(nèi)存泄漏位置進(jìn)行定位;二是判斷應(yīng)用程序所占用的內(nèi)存時間是否超過預(yù)先設(shè)定的內(nèi)存生命周期,當(dāng)超過生命周期時,判斷為發(fā)生內(nèi)存泄漏,并簡單粗暴地強制釋放內(nèi)存。參考專利文獻(xiàn)CN101414272B公開了一種內(nèi)存泄漏的檢測方法和裝置,通過被檢測內(nèi)存的當(dāng)前被占用時間是否超過預(yù)先為被檢測內(nèi)存設(shè)置的生命周期,以及被檢測內(nèi)存是否正在被申請被檢測內(nèi)存的業(yè)務(wù)進(jìn)程所使用,判斷被測內(nèi)存是否發(fā)生泄漏。
[0005]傳統(tǒng)的內(nèi)存泄漏檢測及處理方法過于簡單,比較機(jī)械,實時性不夠,處理方法不夠靈活恰當(dāng),在實際應(yīng)用中效果差強人意。且存在很多缺點:一是采用插粧方式,只能在調(diào)試或者測試階段進(jìn)行,無法在系統(tǒng)正式部署運行期間進(jìn)行內(nèi)存泄漏檢測,實時性不夠;二是采用插粧方式,需要人為分析判斷是否有內(nèi)存泄漏,并人為檢查定位內(nèi)存泄漏位置,大量內(nèi)存申請和釋放過程,導(dǎo)致排查工作量大,難度高,效率低;三是通過內(nèi)存的生命周期簡單判斷為內(nèi)存泄漏,存在誤判情況;四是簡單粗暴地強制釋放內(nèi)存,可能導(dǎo)致關(guān)鍵功能失效異常,影響用戶正常使用。
【發(fā)明內(nèi)容】
[0006]針對傳統(tǒng)的內(nèi)存泄漏檢測處理方法存在的不足之處,本發(fā)明提出了一種嵌入式系統(tǒng)中內(nèi)存泄漏診斷處理的方法和裝置。通過內(nèi)存管理模塊與應(yīng)用程序的動態(tài)協(xié)調(diào),自動有效地準(zhǔn)確診斷內(nèi)存泄漏情況,靈活合理地分配和釋放內(nèi)存,避免簡單粗暴地強制釋放內(nèi)存,導(dǎo)致正在運行的功能失效異常。本發(fā)明實現(xiàn)簡單,檢測準(zhǔn)確,處理方法動態(tài)靈活,具有實時性高,實用性強,準(zhǔn)確可靠,動態(tài)靈活,具有良好的應(yīng)用價值和經(jīng)濟(jì)效益。
[0007]本發(fā)明采用如下技術(shù)方案:
[0008]—種嵌入式系統(tǒng)中內(nèi)存泄漏診斷處理的方法,該方法包括以下步驟,
[0009]SI,將內(nèi)存劃分成大小不同的內(nèi)存塊,每個內(nèi)存塊等分成多個子內(nèi)存,內(nèi)存塊i的子內(nèi)存大小定義為Si,i = l,2,3,…,M,且SKSKXSm,將應(yīng)用程序申請在用的子內(nèi)存管理串接起來構(gòu)成申請鏈表;
[0010]S2,根據(jù)應(yīng)用程序申請內(nèi)存的大小S,申請一個大于等于S的子內(nèi)存Si,并將該子內(nèi)存節(jié)點添加到申請鏈表中;
[0011]S3,應(yīng)用程序用完內(nèi)存后,釋放該子內(nèi)存,刪除申請表鏈中的該子內(nèi)存節(jié)點;
[0012]S4,以固定周期掃描申請鏈表上的所有子內(nèi)存節(jié)點,當(dāng)一個子內(nèi)存占用時間超過內(nèi)存生命周期時,通知應(yīng)用程序進(jìn)行處理。
[0013]進(jìn)一步的,步驟S2中應(yīng)用程序初步申請內(nèi)存的步驟包括,
[0014]S210,從子內(nèi)存最小的內(nèi)存塊i = I開始檢索,依次從小到大檢索內(nèi)存塊;
[0015]S211,判斷內(nèi)存塊中剩余內(nèi)存?zhèn)€數(shù)Pi是否大于零,若是則跳轉(zhuǎn)到步驟S212,若否則1 = 1+1,判斷1是否大于1如果1大于1申請內(nèi)存失敗,如果1不大于1,則轉(zhuǎn)到步驟3211;
[0016]S212,判斷應(yīng)用申請內(nèi)存的大小S是否小于等于子內(nèi)存大小Si,若是則申請內(nèi)存成功,若否則i = i + l,判斷i是否大于M,如果i大于M,申請內(nèi)存失敗,如果i不大于M,則轉(zhuǎn)到步驟S211。
[0017]更進(jìn)一步的,步驟S211或步驟S212中的申請內(nèi)存失敗進(jìn)入深度申請內(nèi)存步驟,
[0018]S220,檢索申請鏈表中的所有子內(nèi)存節(jié)點,將子內(nèi)存大小Si大于申請內(nèi)存大小S且子內(nèi)存占用優(yōu)先級小于申請內(nèi)存優(yōu)先級的子內(nèi)存節(jié)點檢索出來,檢索成功轉(zhuǎn)到步驟S221,檢索失敗則申請內(nèi)存失敗;
[0019]S221,將檢索結(jié)果中優(yōu)先級最低且內(nèi)存最小的子內(nèi)存定義為備用子內(nèi)存;
[0020]S222,釋放備用子內(nèi)存給當(dāng)前申請的應(yīng)用程序使用,申請內(nèi)存成功。
[0021]更進(jìn)一步的,步驟S221中,如果檢索結(jié)果中優(yōu)先級最低且內(nèi)存最小的子內(nèi)存大于一個,則將占用時間長度最長的子內(nèi)存定義為備用子內(nèi)存。
[0022]進(jìn)一步的,步驟S4中通知應(yīng)用程序進(jìn)行處理包括延長內(nèi)存生命周期,或者更改內(nèi)存占用優(yōu)先級,或者直接釋放內(nèi)存,或者應(yīng)用程序內(nèi)存泄漏自動釋放內(nèi)存。
[0023]一種嵌入式系統(tǒng)中內(nèi)存泄漏診斷處理的裝置,它包括,
[0024]內(nèi)存分配管理單元,用于將內(nèi)存劃分成大小不同的內(nèi)存塊,每個內(nèi)存塊等分成多個子內(nèi)存,內(nèi)存塊i的子內(nèi)存大小定義為Si,i = I,2,3,…,M,且SKS2OXSm,將應(yīng)用程序申請在用的子內(nèi)存管理串接起來構(gòu)成申請鏈表;
[0025]內(nèi)存申請單元,用于根據(jù)應(yīng)用程序申請內(nèi)存的大小S,申請一個大于等于S的子內(nèi)存Si,并將該子內(nèi)存節(jié)點添加到申請鏈表中;
[0026]內(nèi)存釋放單元,用于應(yīng)用程序用完內(nèi)存后,釋放該子內(nèi)存,刪除申請表鏈中的該子內(nèi)存節(jié)點;
[0027 ]內(nèi)存診斷單元,用于以固定周期掃描申請鏈表上的所有子內(nèi)存節(jié)點,當(dāng)一個子內(nèi)存占用時間超過內(nèi)存生命周期時,通知應(yīng)用程序進(jìn)行處理。
[0028]進(jìn)一步的,內(nèi)存申請單元包括初步申請內(nèi)存單元和深度申請內(nèi)存單元。
[0029]更進(jìn)一步的,初步申請內(nèi)存單元用于從內(nèi)存塊中剩余未使用子內(nèi)存中申請一個大于等于S的子內(nèi)存。
[0030]更進(jìn)一步的,深度申請內(nèi)存單元,在初步申請單元中申請失敗后,從申請鏈表中將子內(nèi)存大小S1大于申請內(nèi)存大小S且子內(nèi)存占用優(yōu)先級小于申請內(nèi)存優(yōu)先級的子內(nèi)存節(jié)點檢索出來后,查找優(yōu)先級最低且內(nèi)存最小的子內(nèi)存,將該子內(nèi)存釋放給當(dāng)前申請的應(yīng)用程序使用。
[0031]更進(jìn)一步的,優(yōu)先級最低且內(nèi)存最小的子內(nèi)存大于一個,則將其中占用時間長度最長的子內(nèi)存釋放給當(dāng)前申請的應(yīng)用程序使用。
[0032]更進(jìn)一步的,通知應(yīng)用程序進(jìn)行處理包括延長內(nèi)存生命周期,或者更改內(nèi)存占用優(yōu)先級,或者直接釋放內(nèi)存,或者應(yīng)用程序內(nèi)存泄漏自動釋放內(nèi)存。
[0033]本發(fā)明具有如下有益效果:一是能夠在系統(tǒng)運行過程中自動檢測內(nèi)存泄漏情況,不影響系統(tǒng)正常運行,實時性高,實用性強;二是能夠自動有效地定位內(nèi)存泄漏點,大大降低內(nèi)存泄漏排查難度,準(zhǔn)確可靠,維護(hù)效率高;三是通過內(nèi)存管理模塊與應(yīng)用程序的動態(tài)協(xié)商,確認(rèn)內(nèi)存泄漏情況,檢測準(zhǔn)確度高;四是通過內(nèi)存管理模塊與應(yīng)用程序的動態(tài)協(xié)商,確認(rèn)內(nèi)存釋放方式,避免強制釋放內(nèi)存導(dǎo)致應(yīng)用功能失效異常;五是在內(nèi)存不足時,根據(jù)內(nèi)存應(yīng)用等級,強制釋放一些優(yōu)先級比較低的內(nèi)存,確保高優(yōu)先級應(yīng)用功能得到正常運行。
【附圖說明】
[0034]圖1是內(nèi)存塊的結(jié)構(gòu)圖;
[0035]圖2是初步申請內(nèi)存的流程圖;
[0036]圖3是深度申請內(nèi)存的流程圖;
[0037]圖4是車輛綜合信息服務(wù)系統(tǒng)圖。
【具體實施方式】
[0038]為進(jìn)一步說明各實施例,本發(fā)明提供有附圖。這些附圖為本發(fā)明揭露內(nèi)容的一部分,其主要用以說明實施例,并可配合說明書