当前位置: 首页 > 编程语言 > C#

你能阻止内存被交换到磁盘吗?分享

时间:2023-04-10 21:14:29 C#

能防止内存被交换到磁盘吗?我想知道是否可以防止对象(类或结构)的内存被交换到磁盘?编辑:至于为什么我被告知我将要使用的某些数据无法写入磁盘。我不希望它保留足够长的时间来交换数据,但认为值得检查。您可能正在寻找不会交换到磁盘的SecureString类。我不清楚你为什么要这样做。在C#的上下文中,您必须做两件事:“固定”内存以使其不能被垃圾回收重新定位,然后锁定它以防止它被换出。这是一篇很好的博客文章,描述了如何进行第一部分(固定):C#内存固定:将字节数组转换为数据结构现在您需要对象的地址和范围来调用VirtualLock:http://msdn。microsoft.com/en-us/library/Aa366895请注意,VirtualLock仅锁定页面(4K单位),因此您的内存区域必须至少与页面的开头对齐。我假设它需要在不安全的上下文中调用,但我不确定。关于该主题的上一篇文章:防止对象被分页(等效于VirtualLock)另一篇相关博客文章:http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx这在技术上是可行的。可以使用VirtualLock()API函数将内存页面锁定在RAM中。问题是,这需要提供您要锁定的页面的地址。您无法以任何记录的方式从垃圾收集器中获取此地址。它也没有做出任何承诺,例如gen#0堆的相同地址将是可重复的。首先,这个堆的大小是动态的,通常在2到8兆字节之间,具体取决于程序的分配模式。只是随机锁定一个大范围并希望你能抓住其中的大部分也不起作用。进程获得可锁定页面的配额。它不是很大,首先是因为它对机器的运行非常不稳定。龙住在这里。我会做一些完全不同的事情:用函数/分配/任何你想要确保数据不被交换的东西构建一个很好的本机包装器C++DLL(正如有人在这里所说的VirtualLock)。从C#使用它。毕竟,原则上这是可能的,只是你现在被C#束缚了。所以,绕过它!不,这是操作系统的事情。请放心,Windows的分页策略会优先将最常访问的页面保留在内存中,因此如果某个页面对您的应用程序很重要,它会尽可能长时间地存在。嗯,问得好..您可以在Windows中完全禁用交换(size=0),但如果这足以阻止.NET交换,我就不知道了。根据您的环境,您也可以在操作系统级别执行此操作-只需使用具有大量RAM的非常强大的计算机,并完全禁用分页/交换。这确实意味着您最好不要超过RAM,但这就是任务回退到C#的地方-您可以通过智能设计限制最大内存使用量。https://www.howtogeek.com/126430/htg-explains-what-is-the-windows-page-file-and-should-you-disable-it/以上是C#学习教程:可以防止记忆从被交换到磁盘?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: