我想知道是否有可能阻止對象(類或結構)的內存交換到磁盤?你能阻止內存交換到磁盤嗎?
編輯:至於爲什麼我已經告訴了一些我將與不能寫入到磁盤是工作數據。
我不希望它留下足夠長的時間來換出數據,但認爲它值得檢查。
我想知道是否有可能阻止對象(類或結構)的內存交換到磁盤?你能阻止內存交換到磁盤嗎?
編輯:至於爲什麼我已經告訴了一些我將與不能寫入到磁盤是工作數據。
我不希望它留下足夠長的時間來換出數據,但認爲它值得檢查。
你可能會尋找SecureString
class,這將不會被交換到磁盤。
不是真的,這是一個操作系統的東西。
就放心Windows的分頁策略將優先在內存中保存最經常訪問的網頁,因此,如果某個頁面是你的應用程序非常重要,它會在那裏儘可能多地。
嗯,很好的問題..你可以完全禁用Windows交換(大小= 0),但IDK的如果多數民衆贊成足以防止.NET的交換。
這只是技術上可行的。使用VirtualLock()API函數可以將內存頁鎖定在RAM中。問題是,這需要提供您想要鎖定的頁面的地址。您無法以垃圾收集器的任何記錄方式獲取此地址。它也沒有任何承諾,例如gen#0堆的地址是可重複的。首先,堆的大小是動態的,通常在2到8兆之間,取決於程序的分配模式。
只是隨機鎖定一個大範圍,希望你會趕上他們大多也不起作用。一個進程獲取可鎖定頁面的配額。首先它不是很大,因爲它對機器的操作非常不穩定。龍住在這裏。
我仍然不是你爲什麼要做這一點。在C#的上下文中,你必須做兩件事:「固定」內存,使其無法通過垃圾回收進行重定位,然後鎖定它,使其不會被換出。
這裏是一個很好的博客文章,描述瞭如何做的第一部分(釘):
http://www.matthew-long.com/2005/10/18/memory-pinning/
現在你需要的對象的地址和範圍,能夠調用VirtualLock
:
http://msdn.microsoft.com/en-us/library/Aa366895
注意VirtualLock
只鎖定頁(4K的單位),所以你的內存區必須至少是大,對齊到頁面的開始。我假設它需要在unsafe
環境中調用,但我不確定。
的話題上發帖: Prevent an object from being paged out (VirtualLock equivalent)
我會做完全不同的東西:
與營造良好的本地包裝C++ DLL您所需的功能/分配/任何這也將確保數據不會被交換(VirtualLock如有人在這裏說的)。在C#中使用它。
畢竟,它本來就是可能的,它只是你現在綁定到C#。所以,繞過它!
取決於您的環境,您也可以在操作系統級別執行此操作 - 只需使用帶有大量內存的非常健壯的機器,並完全禁用分頁/交換。這意味着你最好不要超越RAM,但這是C#的任務 - 你可以通過智能設計來限制最大內存使用量。
爲什麼要防止這種情況? =) – Jens 2011-01-13 16:11:36
你的意思是除了使用它?通常擔心這種事情是由操作系統決定的。只需使用它,您就可以減少它被放入交換空間的機會。如果你最近沒有使用它,很可能將它放在磁盤上。你看到經常使用的對象被放置在磁盤上嗎? – Crisfole 2011-01-13 16:14:11
我聞到一個微觀優化。你怎麼知道這對你來說是個問題? – 2011-01-13 16:16:22