2014-02-26 52 views
0

我正在實現一個LRU緩存。在將數據放入緩存時,我需要檢查是否有足夠的內存用於新數據,並在沒有數據時調用緩存逐出例程。如何檢查可用內存?如何檢查C#中的可用內存?

回答

7

,我需要檢查自己是否有新的數據足夠的內存,如果調用緩存驅逐程序正是有不是。

這是一個非常糟糕的主意。你不應該這樣做。

正如Raymond Chen常說的:當兩件事情發生時會發生什麼?假設在兩個不同線程的同一地址空間中有兩個組件。現在你有最糟糕的競爭條件:這兩個組件問是否有足夠的內存。假設其中一個有足夠的內存,但不是兩個都有。什麼神奇的力量告訴他們中的一個做緩存驅逐而不是另一個呢?沒有這樣的力量。兩者都會嘗試分配內存,而其中一個會失敗。

即使沒有兩件事,基本的想法也是不好的。這裏的想法是儘可能地走近懸崖邊緣,但不要離得太近,以至於你從懸崖上掉下來。 這是從懸崖上掉下來的食譜。你永遠不應該在任何地方甚至隱約關閉到該懸崖的邊緣。你應該看看這個20億字節的虛擬地址空間,並認爲「哇,這真是令人難以置信」,我不可能永遠不會消耗這麼多。如果你認爲你可能會用完,那麼你需要將你的一些工作轉移到另一個進程中,或者使用內存映射文件並管理你自己的虛擬內存。

所以讓我們退後一步。緩存是一種性能優化,通過更少的時間交易更多的內存使用。您應該問自己的問題是我的客戶幾乎不能接受哪種性能水平?量化。那麼先問一下,是不是已經可以接受緩存的性能?如果是這樣,那麼你不需要燒記憶;你已經夠好了。如果它不夠好,那就試着想出一個固定大小的緩存,它可以提供足夠好的性能。只有當你不能做到這一點,你應該去更先進的技術。

大型高速緩存的一項常用技術是將垃圾收集器負責高速緩存:使高速緩存爲弱引用。弱參考是不參考阻止垃圾收集,但不鼓勵它或者;基本上,如果GC感覺內存不足,GC會收集一些弱引用的對象。您的緩存邏輯基本上是:緩存所有內容。當需要搜索緩存時,詢問弱參考是否已收集。如果答案是肯定的,請從緩存中刪除弱引用。如果答案爲否,則將其重新轉換爲強參考並使用該對象。這種技術很有效,但它有其不足之處:即,您只需讓CLR GC團隊負責調整緩存。他們可能會對創建緩存策略的做法有不同的看法。