内存消耗管理策略

5
我们正在设计一款企业应用程序,它会从后端缓存大量数据。用户可以打开任意数量的应用窗口,每个窗口加载自己的数据并进行缓存。为了管理内存消耗并防止整个操作系统性能下降,我们决定编写一个缓存管理器,它将自动监视应用程序的内存占用情况,并在需要时从缓存中清除数据。
所以问题是我们很难确定何时释放内存。目前,我们采用非常简单的方法 - 当应用程序的内存使用量超过物理内存的80%时,我们就开始从缓存中丢弃内容。
有没有(替代)已经建立的处理此类问题的做法?
1个回答

3

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

如果您选择的阈值太低,则会浪费缓存空间。如果太高,可能无法将其他内容放入内存,包括文件缓存、DLL等。

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

SQL Server使用内存,直到操作系统发出低内存信号(我相信当使用95%的“某些东西”时会发生这种情况)。

您肯定不希望使用GC来释放内存。它会经常杀死整个缓存。

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


我想强调的是,如果您的应用程序消耗了安装的RAM的99%(例如),性能将非常差,因为文件缓存几乎为空。这意味着甚至DLL和.NET NGEN代码也会频繁分页。

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


我所说的可用物理内存是指空闲的内存。我知道垃圾回收在及时对象释放方面不能完全信任,但在我们的测试中,这还不是问题。此外,单独的窗口托管在一个单一的Windows进程中,因此不必担心它们之间的缓存共享。操作系统如何发出有关低内存的信号?有没有办法在.NET中拦截该信号? - george.zakaryan
有一个API可以解决这个问题:https://msdn.microsoft.com/en-us/library/windows/desktop/aa366541(v=vs.85).aspx 但是,Windows认为的“低”可能不是你想要的。这是一个任意的阈值;如果你说“我们使用了80%的空闲内存”,那么这部分内存就不再是空闲的了。因此,这个定义是没有意义的。通过消耗内存,你改变了分母。 - usr
抱歉,关于内存使用情况的声明是我的错误。我已经在问题中进行了更正。 - george.zakaryan
2
“也许更好的策略是假设需要1GB来适当地缓存操作系统和应用程序文件。因此,您可以使用内存,直到已安装的RAM减去1 GB的剩余空间只有10%。”这听起来像是一个很好的方法,可以安全地为自己留出一些缓冲区。 - Ryan Intravia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接