我们正在设计一个从后端缓存大量数据的企业应用程序。允许用户打开任意数量的应用程序窗口,每个窗口都加载自己的数据并对其进行缓存。为了以某种方式管理内存消耗并防止整体操作系统性能下降,我们决定编写一个缓存管理器,它将自动监控应用程序的内存占用,并在需要时从缓存中删除数据。
所以问题是我们很难确定是否是时候释放内存了。目前我们使用一种非常简单的方法 - 当应用程序的内存使用量超过物理内存的80%时,我们就开始丢弃缓存中的内容。
是否存在处理此类问题的(替代?)既定做法?
答案 0 :(得分:3)
这基本上没问题。没有真正好的策略。如果存在多个竞争应用程序,则可能导致缓存竞争和虚假驱逐。
如果选择的阈值太低,则会浪费缓存空间。如果它太高,其他任何东西都不适合内存,包括文件缓存,DLL,......
你的意思是"可用的物理内存"?你的意思是安装的内存或内存是免费的吗?应用程序如何使用80%的可用内存?我不清楚你正在使用的定义。
SQL Server使用内存,直到操作系统发出内存不足的信号(我相信当95%的"某些内容正在使用时)。
您当然不想使用GC来释放内存。它会经常杀死你的整个缓存。
也许你可以将缓存内容完全移到磁盘上?或者,您可以通过隐藏缓存服务器进程(可以通过应用程序进程进行查询)来共享.NET进程之间的缓存。
我想强调的是,如果您的应用程序占用已安装RAM的99%(作为示例),性能将非常糟糕,因为文件缓存几乎为空。这意味着即使是DLL和.NET NGEN代码也会被频繁地分页。
也许更好的策略是假设需要1GB来适当缓存操作系统和应用程序文件。所以你可以消耗内存,直到只有10%的已安装RAM减去1 GB。