- .NET 是否会浪费时间检查所有这些数据来进行垃圾回收?
- Gen 2 GC (检查所有对象的GC)发生频率有多高?
- 是否有任何方法可以减少其频率或暂时禁止其发生?
- 我知道什么时候可以释放大量内存,有没有办法进行优化?我目前正在调用 GC.Collect(); GC.WaitForPendingFinalizers();
更新: 性能计数器“%GC时间”显示平均值为10.6%。
更新: 性能计数器“%GC时间”显示平均值为10.6%。
GC.SuppressFinalize(*your object*)
更多信息请参见:链接文字
看一下 System.Runtime.GCSettings.LatencyMode
属性。
在 app.config 中将 GCServer 属性设置为 true 也有助于减少 GC 的发生(在我的情况下启用后,GC 减少了 10 倍)。
只有当垃圾回收器需要一些gen2内存(因为gen1已满)时,它才会发生(通常)。你是在推测吗?还是你确实遇到了垃圾回收占用大量执行时间的问题?如果没有问题,我建议您暂时不要担心它 - 但请使用性能监视器密切关注。
避免在页面和智能、交互式用户控件中混合使用太多功能(这些控件实际上大多数都存在于使用此控件的每个页面中)。
停止在基类上生成通用功能。有时候重复是更好的选择。继承是有成本的。
对于某些复杂功能,我会将所有内容放在同一个函数中。是的,最多可能达到100行代码。当我在 .net 性能指南中看到这个建议时,我并不相信,但它确实有效。调用堆栈是一个问题,使用类属性而不是局部变量也是一个问题。类级别的变量可能会很麻烦。
停止使用复杂的基类,不存在超过7行的基类。如果你将更大的类分散在整个框架中,你会遇到问题。
我开始使用更多的静态对象和功能。我看到了另一个人设计的应用程序。所有数据访问对象方法(插入、更新、删除、选择)都是静态的。具有更多并发用户的应用程序从未超过45MB。
为了节省一些项目,我喜欢稳定状态模式。我在现实世界中学到了这个模式,但作者 Nygard 在他的书《发布 IT - 设计和部署生产就绪软件》中也同意我的看法。他将这种方法称为稳定状态模式。这种模式表明我们可能需要一些东西来释放空闲资源。
你可能想在机器配置文件中进行一些调整。在 memoryLimit 属性上,你将指示进程重新启动之前可以达到的内存百分比。
你可能还想在机器配置文件中进行一些调整。在此属性上,GC 将决定机器的行为(工作站 GC 和服务器 GC)。这个选项也可能会极大地改变内存消耗行为。
当我开始关注这些项目时,我取得了很多成功。希望这可以帮到你。
-- 于04-05-2014进行编辑 由于GC新版本的改进和HTML 5以及MVC框架的进步,我改变了许多想法。