我想知道是否可以防止对象(类或结构)的内存被交换到磁盘?
编辑:至于为什么我被告知我要使用的一些数据无法写入磁盘。
我不希望它留下足够长的时间来换掉数据但是认为值得检查。
答案 0 :(得分: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)
答案 1 :(得分:6)
您可能正在寻找不会被交换到磁盘的SecureString
class。
答案 2 :(得分:4)
这在技术上是可行的。可以使用VirtualLock()API函数将内存页锁定在RAM中。问题是,这需要提供您想要锁定的页面的地址。您无法从垃圾收集器以任何文档的方式获取此地址。也没有任何承诺,例如,#0堆的相同的地址将是可重复的。首先,该堆的大小是动态的,通常介于2到8兆字节之间,具体取决于程序的分配模式。
随机锁定一个大范围,希望你能抓住它们中的大多数也不起作用。进程获取可锁定页面的配额。它不是很大,首先是因为它对机器的操作非常不稳定。龙住在这里。
答案 3 :(得分:4)
我会做一些完全不同的事情:
使用所需的函数/分配/无论构建一个漂亮的原生包装C ++ DLL ,这也将确保数据不会被交换(VirtualLock就像有人在这里说的一样) )。从C#中使用它。
毕竟,原则上它是可能的,只是你现在已经被C#绑定了。所以,绕过它!
答案 4 :(得分:0)
不是,这是一个操作系统的事情。
请放心,Windows的分页策略会优先考虑将最常访问的页面保留在内存中,因此如果某个页面对您的应用程序很重要,那么它将尽可能地存在。
答案 5 :(得分:0)
嗯,好问题..你可以完全禁用Windows中的交换(size = 0),但是如果这足以阻止.NET交换那么就是idk。
答案 6 :(得分:0)
根据您的环境,您也可以在操作系统级别执行此操作 - 只需使用具有大量RAM的非常强大的计算机,并完全禁用分页/交换。它确实意味着你最好不要超过RAM,但这就是任务回到C#的地方 - 你可以通过智能设计限制最大内存使用量。