記憶體池相信都不陌生,實現的方法也有很多,簡單的,複雜的,不一而足,網上也有很多現成的實現代碼。
但大多有一個缺點,不可回收--也就是說剛開始那記憶體池分配的是多大,程式運行期間就一直那麼大。
這種實現方式被大量的記憶體池實現所應用,比較簡單,效率也比較高,但其還是有局限的。
大家可以試一下,當你在運行一個大的程式,該程式佔據了大量的記憶體,此時你把它最小化,在windows工作管理員中,你會看到該程式的記憶體佔用量劇減,其實並不是這先記憶體被釋放了,是windows在背後做的小動作--windows把一些該程式不常用到的記憶體區間都寫到磁碟上的pagefile中了。當程式被再次拉向前台時,該程式需要使用的記憶體就會再次從pagefile中裝回來。如果這段記憶體量很大的話,而硬碟的讀盤速度又不是很快,這時你就會明顯的感覺到停滯感,甚至連鍵盤滑鼠的響應都會延遲,這在打遊戲的時候應該是很常見的。
所以,當你用不可回收的記憶體池申請了一塊很大的區間時,你的程式可能已經用完了他,在記憶體池的記錄中,該記憶體段也被標記為“可再次使用”,可是windows並不知道,它只知道使用者申請了這樣一塊記憶體,並且始終不還給它。但是呢,這塊記憶體的利用率又比較小,這時windows就回想,既然它不怎麼被使用,那就把它寫硬碟上吧。問題就來了....
當然,這種問題在記憶體池不是很大,使用率又很高的情況下是很微小的,但是如果在這樣一種情況(也是筆者曾考慮過的情況):
1.記憶體池在程式中大量應用。
2.對記憶體地區分段,比如32位元組以內的記憶體需求量分為一段,32·64一段,64·128一段.....
總的來說,這種方法也是挺好的,主要考慮到減小記憶體片段。將差不多記憶體大小的放在一起,方便再次劃分,提高索引效率等。
但也還是避免不了上面的問題,尤其是那種大型記憶體需求段的情況。
所以記憶體池使用還是需斟酌的,不可不用,不可濫用,關鍵是找出其中一個適合的量,可回收的記憶體池,也是要掌握一個量,經常的回收肯定不利於效率的提升,考慮平台,鑒戒前人經驗,以及儘可能的實驗的情況下就能盡量的找到這個度。