內(nèi)存池管理方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,尤其是一種內(nèi)存池管理方法。
【背景技術(shù)】
[0002]現(xiàn)今的操作系統(tǒng)中,對內(nèi)存的使用已經(jīng)成為是程序員最棘手的問題,對內(nèi)存的釋放與申請內(nèi)存長度不同等不當(dāng)使用往往會(huì)造成程序崩潰、內(nèi)存越界,也可能會(huì)出現(xiàn)由于內(nèi)存越界導(dǎo)致的數(shù)據(jù)不正確等各種詭異問題。各種語言的自動(dòng)內(nèi)存回收等機(jī)制也被不斷開發(fā)出來。即便是能能正確的申請和釋放內(nèi)存,當(dāng)頻繁進(jìn)行申請和釋放也可能會(huì)造成以下兩個(gè)問題。一是對效率的影響,申請和釋放內(nèi)存在操作系統(tǒng)能夠內(nèi)部需要做很多處理,效率往往不高。二是由于系統(tǒng)內(nèi)存分配機(jī)制問題造成,當(dāng)用戶請求一個(gè)內(nèi)存單元小于一個(gè)頁時(shí),系統(tǒng)會(huì)在內(nèi)存頁上分配內(nèi)存,但當(dāng)另一個(gè)內(nèi)存請求大于上個(gè)頁的剩余空間時(shí),系統(tǒng)會(huì)在新的頁上分配所請求的內(nèi)存空間,此時(shí)第一個(gè)頁的剩余空間就會(huì)形成碎片,形成大量內(nèi)存碎片后會(huì)導(dǎo)致系統(tǒng)運(yùn)行效率下降,甚至導(dǎo)致程序不能運(yùn)行。用于頻繁接收請求并發(fā)送處理結(jié)果的網(wǎng)絡(luò)服務(wù)器更容易出現(xiàn)問題,系統(tǒng)會(huì)很快的耗盡內(nèi)存使系統(tǒng)運(yùn)行效率逐漸降低,最后不能處理請求。
[0003]頻繁申請和釋放內(nèi)存單元會(huì)對降低效率,增加CPU開銷,可以使用事先分配足夠多內(nèi)存單元方式降低申請和釋放的開銷,但事先分配內(nèi)存單元的缺點(diǎn)是我們并不確定我們將要使用的內(nèi)存單元大小,如果頻繁需求的內(nèi)存大小遠(yuǎn)遠(yuǎn)小于事先分配的內(nèi)存單元,則會(huì)造成內(nèi)存單元的巨大浪費(fèi),同時(shí)如果事先分配太多內(nèi)存到內(nèi)存池,當(dāng)用戶沒有頻繁的內(nèi)存請求時(shí)會(huì)造成系統(tǒng)和應(yīng)用程序也不能使用此部分內(nèi)存,同樣造成內(nèi)存的浪費(fèi)。并且,在實(shí)際開發(fā)中經(jīng)常會(huì)出現(xiàn)的內(nèi)存重復(fù)釋放,內(nèi)存越界,內(nèi)存越界的問題,從而導(dǎo)致服務(wù)器不穩(wěn)定,崩潰,定位困難。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的目的在于提供一種內(nèi)存池管理方法,以提高內(nèi)存的分配性能并同時(shí)判斷內(nèi)存的合法性。
[0005]為了達(dá)到上述目的,本發(fā)明提供了一種內(nèi)存池管理方法,包括:將內(nèi)存池劃分為多個(gè)大小不同的次級內(nèi)存池,各個(gè)次級內(nèi)存池按照不同的對齊長度對應(yīng)不同的內(nèi)存鏈表;
[0006]根據(jù)需要的內(nèi)存空間的大小選擇次級內(nèi)存池,按照與所選擇的次級內(nèi)存池對應(yīng)的對齊長度分配內(nèi)存;
[0007]在分配的內(nèi)存空間前加一頭結(jié)構(gòu),所述頭結(jié)構(gòu)用于記錄所述分配的內(nèi)存空間的大小以及使用狀態(tài)。
[0008]優(yōu)選的,在上述的內(nèi)存池管理方法中,將所述內(nèi)存池劃分為三個(gè)大小不同的次級內(nèi)存池,分別為:第一次級內(nèi)存池、第二次級內(nèi)存池和第三次級內(nèi)存池,所述第一次級內(nèi)存池的空間小于所述第二次級內(nèi)存池,所述第二次級內(nèi)存池小于所述第三次級內(nèi)存池。
[0009]優(yōu)選的,在上述的內(nèi)存池管理方法中,當(dāng)需要的內(nèi)存空間小于等于第一閾值時(shí),選擇所述第一次級內(nèi)存池;當(dāng)需要的內(nèi)存空間大于所述第一閾值且小于等于第二閾值時(shí),選擇所述第二次級內(nèi)存池;當(dāng)需要的內(nèi)存空間大于所述第二閾值時(shí),選擇所述第三次級內(nèi)存池。
[0010]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第一次級內(nèi)存池的對齊長度為16字節(jié)的自然數(shù)倍數(shù)。
[0011]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第一次級內(nèi)存池的對齊長度為16字節(jié)。
[0012]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第二次級內(nèi)存池的對齊長度為128字節(jié)的自然數(shù)倍數(shù)。
[0013]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第二次級內(nèi)存池的對齊長度為128字
-K-
T O
[0014]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述頭結(jié)構(gòu)包括第一頭結(jié)構(gòu)和第二頭結(jié)構(gòu),所述第一頭結(jié)構(gòu)用于記錄所述分配的內(nèi)存空間的大小,所述第二頭結(jié)構(gòu)用于記錄所述分配的內(nèi)存空間的使用狀態(tài)。
[0015]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第一頭結(jié)構(gòu)分配有4個(gè)字節(jié)。
[0016]優(yōu)選的,在上述的內(nèi)存池管理方法中,所述第二頭結(jié)構(gòu)分配有I個(gè)字節(jié),當(dāng)所述分配的內(nèi)存空間在使用中時(shí),所述第二頭結(jié)構(gòu)中的值設(shè)置為I;當(dāng)所述分配的內(nèi)存空間被釋放后,所述第二頭結(jié)構(gòu)中的值設(shè)置為O。
[0017]在本發(fā)明提供的內(nèi)存池管理方法中,將內(nèi)存池劃分為多個(gè)大小不同的次級內(nèi)存池,各個(gè)次級內(nèi)存池按照不同的對齊長度對應(yīng)不同的內(nèi)存鏈表。每個(gè)鏈表都是獨(dú)立線程安全的,同步顆粒更小,相應(yīng)減少了同步,提高了分配性能。根據(jù)需要的內(nèi)存空間的大小選擇次級內(nèi)存池,按照與所選擇的次級內(nèi)存池對應(yīng)的對齊長度分配內(nèi)存,并在分配的內(nèi)存空間前加一用于記錄所述分配的內(nèi)存空間的大小以及使用狀態(tài)的頭結(jié)構(gòu),并通過所述頭結(jié)構(gòu)中的值來判斷內(nèi)存使用的合法性,生成調(diào)用堆棧,并記錄日志,便于分析和定位問題代碼。
【附圖說明】
[0018]圖1為本發(fā)明實(shí)施例中內(nèi)存池管理方法的流程圖。
【具體實(shí)施方式】
[0019]下面將結(jié)合示意圖對本發(fā)明的【具體實(shí)施方式】進(jìn)行更詳細(xì)的描述。根據(jù)下列描述和權(quán)利要求書,本發(fā)明的優(yōu)點(diǎn)和特征將更清楚。需說明的是,附圖均采用非常簡化的形式且均使用非精準(zhǔn)的比例,僅用以方便、明晰地輔助說明本發(fā)明實(shí)施例的目的。
[0020]本發(fā)明實(shí)施例提供了一種內(nèi)存池管理方法,具體的,如圖1所示,包括以下步驟:
[0021]S1:將內(nèi)存池劃分為多個(gè)大小不同的次級內(nèi)存池,各個(gè)次級內(nèi)存池按照不同的對齊長度對應(yīng)不同的內(nèi)存鏈表。
[0022]在本實(shí)施例中,將所述內(nèi)存池劃分為三個(gè)大小不同的次級內(nèi)存池,分別為:第一次級內(nèi)存池、第二次級內(nèi)存池和第三次級內(nèi)存池,所述第一次級內(nèi)存池的空間小于所述第二次級內(nèi)存池,所述第二次級內(nèi)存池小于所述第三次級內(nèi)存池。
[0023]所述第一次級內(nèi)存池的對齊長度為16字節(jié)的自然數(shù)倍數(shù)。較優(yōu)的,所述第一次級內(nèi)存池的對齊長度為16字節(jié)。當(dāng)然在本本發(fā)明的其他實(shí)施例中,所述第一次級內(nèi)存池的對齊長度還可以是32字節(jié)、48字節(jié)或者64字節(jié),但是考慮到在實(shí)際應(yīng)用過程中,對齊長度過長會(huì)造成資源浪費(fèi),因此在本實(shí)施例中所述第一次級內(nèi)存池的對齊長度選擇16字節(jié)。
[0024]所述第二次級內(nèi)存池的對齊長度為128字節(jié)的自然數(shù)倍數(shù)。較優(yōu)的,所述第二次級內(nèi)存池的對齊長度為128字節(jié)。在本發(fā)明的其他實(shí)施例中,所述第二次級內(nèi)存池的對齊長度還可以設(shè)置為其他長度,但是避免資源浪費(fèi),在本實(shí)施例中所述第二次級內(nèi)存池的對齊長度選擇128字節(jié)。
[0025]所述第三次級內(nèi)存池不設(shè)置對齊長度,也就是說,在所述第三次級內(nèi)存池中按照實(shí)際需要分配內(nèi)存。
[0026]S2:根據(jù)需要的內(nèi)存空間的大小選擇次級內(nèi)存池,按照與所選擇的次級內(nèi)存池對應(yīng)的對齊長度分配內(nèi)存。
[0027]具體的,當(dāng)需要的內(nèi)存空間小于等于第一閾值時(shí),選擇所述第一次級內(nèi)存池;當(dāng)需要的內(nèi)存空間大于所述第一閾值且小于等于第二閾值時(shí),選擇所述第二次級內(nèi)存池;當(dāng)需要的內(nèi)存空間大于所述第二閾值時(shí),選擇所述第三次級內(nèi)存池。
[0028]在本實(shí)施例中,所述第一閾值為20KB,當(dāng)所需要的內(nèi)存空間小于等于20KB時(shí),將按照所述第一次級內(nèi)存池的對齊長度16字節(jié)來分配內(nèi)存。所述對齊長度是指在分配內(nèi)存時(shí)每次分配的最小長度。例如,當(dāng)需要的內(nèi)存空間為12字節(jié)時(shí),為其分配16字節(jié)的空間。當(dāng)需要的內(nèi)存空間為16字節(jié)時(shí),為其分配的空間也是16字節(jié)。當(dāng)需要的內(nèi)存空間為29字節(jié)時(shí),則為其分配2個(gè)16字節(jié)長度的空間,即32字節(jié)的空間。
[0029]所述第二閾值為1MB。當(dāng)所需要的內(nèi)存空間大于20KB時(shí)且小于等于IM