1

我有几个需要真实内存的应用程序,它们消耗了大量内存。一种解决方案是将应用程序中的每一块内存都锁定(VirtualLock),但由于应用程序位于 .NET 中,因此需要很多小时才能做好。

所以,我的问题是,禁用交换文件(我的机器上有很多 RAM)是确保所有内容都真正在内存中的有效策略吗?

更新:

让我重复一遍 - 我知道这可能是非常肮脏的做事方式,并且可能会破坏整个操作系统的运行,但是,我将承担全部责任并应对后果,只想知道我可能会遇到什么,问题明智的。

以下是其他 StackExchangers 的看法:https ://serverfault.com/questions/23621/any-benefit-or-detriment-from-removing-a-pagefile-on-an-8gb-ram-machine

4

3 回答 3

2

你不能通过这样做强制进入内存的一件事:可执行图像和映射文件。这些是他们自己的每个“页面文件”。当内存压力发生时,Windows 检测到它们在内存中的页面没有被修改,并且只是丢弃这些页面,因为它们可以稍后重新加载。

所有没有文件支持的东西都不能被分页(只是没有地方放它)。所以我想你的技术在实践中会起作用。

你不会看到很多问题。我一直在运行而没有分页文件(16GB RAM)。在蓝屏的情况下,您失去了捕获完整内存转储的能力,但很可能您不需要它。

只要确保你永远不会达到物理内存限制,否则很多程序会严重崩溃。没有人编写他们的程序来应对 OOM 情况(除了我从未见过的核心 Windows 组件崩溃。他们做得很好。)。

于 2012-07-14T12:04:34.077 回答
1

我只需要确保我的数据始终在内存中

但是在内存中有数据而不是访问它所需的代码有什么好处呢?您可以确定您的数据在 RAM 中,但您不能确定代码是否在 RAM 中。当需要重新调入代码时,您将产生完全相同的延迟。第一组候选对象是 .NET 框架程序集,它们经过预编译(“ngen-ed”)并由它们的 *.ni.dll 支持文件。你可以做些什么,你可以从 GAC 目录(c:\windows\assembly\gac_64 和 gac_msil 目录)中删除它们。当您运行多个 .NET 程序时,您将付出的代价是显着减慢热启动和不共享。下一组候选是 Windows 操作系统 DLL。对此你无能为力。

另一件需要担心的是文件系统缓存。随着 RAM 使用量的增加,缓存会缩小。这将显着减慢磁盘访问速度。特别是如果无法缓存,写入速度会非常慢,从几微秒到几秒。

当您的 RAM 使用高度可预测且远低于限制并且您只在机器上运行一个程序时,这很可能不是一个真正的问题。您必须对其进行监控以确保情况如此。不得不担心 RAM 大大违背了购买大量 RAM 的目的。特别是当您不能保证禁用分页文件实际上会给您带来任何好处时。

于 2012-07-14T12:58:15.570 回答
1

我尝试禁用页面文件。结局并不好...

我只想说我做了一次野鹅追逐。禁用页面文件对磁盘 i/o 施加了极大的压力,现在已经承受了所有的打击。

摘要:就我而言,让 Windows 平衡文件缓存/应用程序内存使用是明显的赢家。

于 2012-07-15T22:54:05.710 回答