滞后时间模式
若要回收对象,垃圾回收器必须停止应用程序的所有正在执行的线程。 在某些情况下,例如当应用程序检索数据或者显示内容时,完整垃圾回收可能会在关键时刻进行,而且可能会影响性能。 可以通过将 GCSettings.LatencyMode 属性设置为 System.Runtime.GCLatencyMode 值之一来调整垃圾回收器的侵入性。
滞后时间指的是垃圾回收器侵入应用程序的时间。 在低滞后时间期间,垃圾回收器在回收对象时较保守且侵入性较弱。 建议您在需要 GCLatencyMode.LowLatency 模式时仅在短时间内使用该模式。 否则,如果系统处于内存压力下,垃圾回收器将触发一次回收,这样会暂时暂停应用程序并中断对时间要求很急的操作。
在低滞后时间期间,将取消生成第 2 代回收,除非发生以下情况:
系统从操作系统接收内存不足通知。
通过调用 GC.Collect 方法并为 generation 参数指定 2,您的应用程序代码包含一个集合。
低滞后时间模式应当用于以下应用程序:包含运行时间较短的代码块,而且必须在运行时中断最少的情况下运行。 虽然 LowLatency 模式设计用于存在某些时间限制的情况中,但它并不是针对存在严格实时限制的情况的解决方案。
下表列出了 GCLatencyMode 值适用的应用程序方案。
滞后时间模式 |
应用程序方案 |
---|---|
适用于没有 UI 或服务器端操作的应用程序。 |
|
适用于多数有 UI 的应用程序。 |
|
适用于具有时效性短期操作并且在此期间可以打破垃圾回收器中的中断的应用程序。 例如,执行动画呈现或数据采集功能的应用程序。 |
默认垃圾回收模式
如果未指定 LatencyMode 属性,则默认模式为并发工作站垃圾回收。 该模式取决于两个运行时配置设置的值:
-
如果启用,则此设置指定公共语言运行时在单独的线程上运行工作站垃圾回收以支持并发操作。 默认情况下会启用此设置。
-
如果启用,则此设置指定公共语言运行时运行服务器垃圾回收;如果未启用,则运行工作站垃圾回收。 只能在具有两个或更多处理器的计算机上启用服务器垃圾回收。 默认情况下不启用此选项。
如果启用此设置,则自动禁用 <gcConcurrent>。
GCLatencyMode 的默认值如下:
在启用 <gcConcurrent> 且禁用 <gcServer> 时为 Interactive。
在禁用 <gcConcurrent> 或启用 <gcServer> 时为 Batch。
注意 |
---|
如果应用程序在实现 Intel Itanium 体系结构的 64 位系统(以前称为 IA-64)上运行 WOW64 x86 仿真程序,则在这些应用程序中不支持并发垃圾回收。 |
低滞后时间使用准则
使用 LowLatency 模式时,请考虑下列准则:
使处于低滞后时间模式的时间尽可能短。
在低滞后时间期间,避免分配大量内存。 可能会出现内存不足通知,因为垃圾回收所回收的对象较少。
在低滞后时间模式下,最大限度地减少所进行的分配次数,特别是向大型对象堆和固定对象所做的分配。
请注意可能正在进行分配的线程。 由于 LatencyMode 属性设置是针对整个进程的,因此也许会在任何可能正在分配的线程上产生 OutOfMemoryException。
将低滞后时间代码包装在受约束的执行区域中(有关更多信息,请参见受约束的执行区域)。
可以通过调用 GC.Collect(Int32, GCCollectionMode) 方法在低滞后时间期间强制进行第 2 代回收。