内存消费管理策略

geo*_*yan 5 .net c# memory clr memory-management

我们正在设计一个企业应用程序,它从后端缓存大量数据.允许用户打开任意数量的应用程序窗口,每个窗口都加载自己的数据并对其进行缓存.为了以某种方式管理内存消耗并防止整体操作系统性能下降,我们决定编写一个缓存管理器,它将自动监视应用程序的内存占用并在需要时从缓存中删除数据.

所以问题是我们很难确定是否是时候释放内存了.目前我们使用一种非常简单的方法 - 当应用程序的内存使用量超过物理内存的80%时,我们就开始丢弃缓存中的内容.

是否存在处理此类问题的(替代?)既定做法?

usr*_*usr 3

这基本上就可以了。没有真正好的策略。如果存在多个竞争应用程序,这可能会导致缓存竞争和错误驱逐。

如果您选择的阈值太低,则会浪费缓存空间。如果它太高,则内存中可能无法容纳任何其他内容,包括文件缓存、DLL...

“可用物理内存”是什么意思?您是指已安装的内存还是可用的内存?应用程序如何使用 80% 的可用内存?我不清楚您使用的定义。

SQL Server 会一直使用内存,直到操作系统发出内存不足的信号(我相信当 95% 的“某物”正在使用时就会发生这种情况)。

您当然不想使用 GC 来释放内存。它通常会杀死你的整个缓存。

也许您可以将缓存内容完全移至磁盘?或者,您可以通过拥有可由应用程序进程查询的隐藏缓存服务器进程来在 .NET 进程之间共享缓存。


我想强调的是,如果您的应用程序消耗了 99% 的已安装 RAM(作为示例),性能将非常糟糕,因为文件缓存几乎为空。这意味着即使是 DLL 和 .NET NGEN 代码也会频繁地调出和调入。

也许更好的策略是假设需要 1GB 来适当缓存操作系统和应用程序文件。因此,您可以消耗内存,直到已安装的 RAM 只剩下 10% 的可用空间减去 1 GB。

  • +1“也许更好的策略是假设需要 1GB 来适当缓存操作系统和应用程序文件。因此,您可以消耗内存,直到安装的 RAM 中只有 10% 的可用空间减去 1GB。” 这听起来是一个安全地给自己一些缓冲空间的好方法。 (2认同)