c# - 内存消耗管理策略

标签 c# .net memory memory-management clr

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

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

是否有任何(替代?)既定做法来处理此类问题?

最佳答案

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

如果您选择的阈值太低,则会浪费缓存空间。如果它太高,则没有其他东西可以放入内存,包括文件缓存、DLL、...

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

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

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

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


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

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

关于c# - 内存消耗管理策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37464609/

相关文章:

c# - 如何通过主键和外键(右连接)合并两个数据表?

.net - wpf:查找祖先的祖先

C# 套接字检查连接

c# - Entity Framework 5 升级后多对多关系左右键翻转

c# - 为什么 SqlDataReader to DataTable 只有在我使用单独的字段时才有效?

Java 堆内存分配限制

performance - 读取/索引大索引时出现 SOLR 内存不足错误

Haskell http-conduit web-scraping daemon 崩溃并出现内存不足错误

c# - Spreadsheetgear 在加载时删除数据透视表 : can it ignore certain sheets?

c# - 如何检测鼠标左键单击,但在 UI 按钮组件上发生单击时不检测