Rom*_*kov 5 .net garbage-collection
我的程序分配了大量包含长寿命DAWG的实例.在构建这个DAWG的过程中,有时候进度会减慢100倍,这与.NET执行gen 2 GC集合完全相关.在这些期间,"GC中的%时间"为99.5%,"总第2代收集"每隔几秒递增一次.经过几次背靠背第二代收集,他们停止触发没有明显的原因,程序再次加速.几分钟后,循环重新开始.
我创建的实例数量大约为2500万,并且它们占用了几GB的RAM,所以第2代集合花费这么长时间并不太令人惊讶.令人惊讶的是,第二代收藏品出现在"火车"中,并不断被触发.
如果不重新思考我的方法,我能以某种方式阻止这种情况吗?也许有一些方法可以让.NET暂停第2代收藏,直到另行通知?除了这些事件之外,程序运行非常有效,因此除了这种不幸的角落行为之外,.NET显然完全可以完成这项任务.
(我尝试将GCSettings.LatencyMode设置为GCLatencyMode.Batch,但问题仍然存在.GC开始发生时的可用物理RAM量大约为1GB.这是在64位计算机上.)
在 .NET 4.5+ 中,您可以使用新GCLatencyMode选项指定对较少 Gen 2 集合的偏好。
GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
Run Code Online (Sandbox Code Playgroud)
更多信息在这里:
我的应用程序不能容忍特定时间窗口内的暂停
越来越多的 .NET 开发人员构建了商业应用程序和服务,可根据定义的业务需求或 SLA 交付结果。股票市场是必须在市场开放时提供非常及时结果的服务的例子。通常,这些应用程序在想要提供低延迟结果时会执行大量工作。然而,他们不能容忍由于收集而引起的明显停顿。
我们的客户告诉我们,如果这样做可以消除长时间的暂停时间(通常由完全阻塞 GC 引入),他们会在他们的服务器上部署更多内存。在 .NET Framework 4.5 中,我们通过引入 SustainedLowLatency 模式来提供该选项,该模式可避免完全阻塞 GC。此模式也可通过更新 4.0.3 用于 .NET Framework 4 中的工作站 GC。
虽然 SustainedLowLatency 设置有效,但第 0 代、第 1 代和后台第 2 代收集仍会发生,并且通常不会导致明显的暂停时间。仅当机器内存不足或应用程序通过调用 GC.Collect() 引发 GC 时,才会发生阻塞的第 2 代收集。将使用 SustainedLowLatency 设置的应用程序部署到具有足够内存的计算机上至关重要,这样它们才能在设置生效时满足堆中产生的增长。
在 .NET Framework 4.5 中,SustainedLowLatency 模式可用于工作站和服务器 GC。要打开它,请将 GCSettings.LatencyMode 属性设置为 GCLatencyMode.SustainedLowLatency。.NET Framework 4 包括用于工作站 GC 的 LowLatency 模式;但是,此设置仅适用于短期,而 SustainedLowLatency 模式适用于更长时间。
还有NoGCRegion你可以尝试的。
https://msdn.microsoft.com/en-us/library/system.runtime.gclatencymode%28v=vs.110%29.aspx
指示在应用程序执行关键路径时暂停垃圾收集。NoGCRegion 是只读值;也就是说,您不能将 NoGCRegion 值分配给 GCSettings.LatencyMode 属性。您可以通过调用 TryStartNoGCRegion 方法指定无 GC 区域延迟模式,并通过调用 EndNoGCRegion 方法终止它。
| 归档时间: |
|
| 查看次数: |
1127 次 |
| 最近记录: |