你可以阻止内存被交换到磁盘吗?

Dre*_*dan 11 .net c# memory memory-management

我想知道是否有可能防止对象(类或结构)的内存被交换到磁盘?

编辑:至于为什么我被告知我将要使用的一些数据无法写入磁盘.
我不希望它留下足够长的时间来换掉数据但是认为值得检查.

Eme*_*ger 9

我仍然不清楚你为什么要这样做.在C#的上下文中,你必须做两件事:"固定"内存,以便它不能通过垃圾收集重新定位,然后锁定它以便它不会被换出.

这是一篇很好的博客文章,描述了如何完成第一部分(固定):

http://www.matthew-long.com/2005/10/18/memory-pinning/

现在您需要能够调用的对象的地址和范围VirtualLock:

http://msdn.microsoft.com/en-us/library/Aa366895

请注意,VirtualLock只锁定页面(4K的单位),因此您的内存区域必须至少与该页面的开头对齐.我假设它需要在unsafe上下文中调用,但我不确定.

以前关于该主题的帖子: 防止对象被分页(VirtualLock等效)

另一篇相关博客文章:http: //geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx


SLa*_*aks 6

你可能会寻找SecureString,它不会被交换到磁盘.

  • 有没有可用的参考证明SecureString没有被交换?我看到它可以是GCed,不会被合并并且是隐式加密的.如果SecureString没有被交换,它的实现可能会给出一个提示. (3认同)
  • SecureString就像任何其他托管内存一样被交换到磁盘 - 但是当它发生时,它就被加密了.http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx - 为了防止页面文件出现问题,请使用unsafe {}和VirtualLock() (3认同)