c# - 当调用 GC.Collect() 并释放超过 3GB 的空间时,这一定是一件好事吗?
问题描述
我在这个网络上阅读了很多关于何时应该使用GC.Collect()
的问题,但没有一个能解决这个问题。
如果我们以某种方式设法使用它,例如它释放大量内存,这是否一定是一件好事,而不是简单地依靠垃圾收集器来管理内存?
无论我的 ASP.NET 应用程序保持多空闲,或者经过了多少时间,或者完成了多少操作,显式调用时释放的内存GC.Collect()
永远不会被寻址(只有它上面的内存,就像它是某种缓存一样。 )
我想到的一个理论是,也许那些 3GB+ 没有被释放(而是应用程序释放高于该阈值的内存)的原因可能是由于重用了它的一部分,或者可能是其他一些有用的优化,代价是当然,在应用程序的整个运行时使用该内存。
有人可以就这些问题分享一些见解吗?只要有机会,我就会遵循最佳实践并处理对象。没有任何非托管资源需要最终确定——它总是由我处理。
编辑:使用的垃圾收集器是工作站之一,而不是服务器。
解决方案
垃圾收集器的工作是模拟具有无限内存的机器。如果您的系统有足够的未分配内存来继续运行,那么收集器为什么要花费 CPU 周期来执行识别未引用对象的艰苦工作呢?这是零收益的性能成本。
如果不理会,当系统开始内存不足时,收集器将运行并释放这 3GB。在那之前它处于休眠状态。
推荐阅读
- openssl - 使用 openssl 以特定格式创建 RSA 密钥
- python - 更高维度的 KMeans 聚类是否可行?
- r - 强制 rsconnect::deployApp() 无法测试“on.failure”
- javascript - 如何创建复制到剪贴板?将数据从 h1 标签复制到输入(反应)
- asp.net-core - 无法更新一对多关系(尝试边做边学)
- ruby-on-rails - 在 ElasticSearch 结果中生成/添加搜索词
- javascript - 如何在不重新加载页面的情况下从输入名称中获取变量
- ember-octane - 基于 ember octane 中选择的答案的基于条件的显示部分
- django - 为父母和孩子显示产品的类别和子类别
- .net-core - .Net Core 或 .Net 5 中的 Membership.ValidateUser()