延迟模式

若要回收对象,垃圾回收器(GC)必须停止应用程序中所有正在执行的线程。 垃圾回收器处于活动状态的时间段称为其 延迟

在某些情况下(例如当应用程序检索数据或显示内容时),关键时刻可能发生完整的垃圾回收,从而妨碍性能。 可以通过将 GCSettings.LatencyMode 属性设置为其中 System.Runtime.GCLatencyMode 一个值来调整垃圾回收器的侵入性。

低延迟设置

使用“低”延迟设置意味着垃圾回收器在应用程序中入侵更少。 垃圾回收在回收内存方面较为保守。

System.Runtime.GCLatencyMode枚举提供两个低延时设置:

  • GCLatencyMode.LowLatency 禁止第 2 代集合,仅执行第 0 代和 1 代集合。 它只能在短时间内使用。 在更长时间内,如果系统处于内存压力下,垃圾回收器将触发一次回收,这样会暂时暂停应用程序并中断对时间要求很急的操作。 此设置仅适用于工作站垃圾回收。

  • GCLatencyMode.SustainedLowLatency 禁止前台第 2 代集合,并且仅执行第 0、1 代和后台第 2 代集合。 它可以使用更长时间,并适用于工作站和服务器的垃圾回收。 如果禁用后台垃圾回收,则无法使用此设置。

在低延迟期间,除非发生以下情况,否则禁止第 2 代回收:

  • 系统从操作系统接收一个低内存通知。

  • 应用程序代码通过调用 GC.Collect 方法并为参数指定 2 generation 来引入集合。

情境

下表列出了使用 GCLatencyMode 这些值的应用程序方案:

延迟模式 应用程序方案
Batch 对于不具有用户界面 (UI) 或服务器端操作的应用程序。

禁用后台垃圾回收时,这是工作站和服务器垃圾回收的默认模式。 Batch 模式还会替代 gcConcurrent 设置,即它阻止后台或并发集合。
Interactive 对于具有 UI 的大多数应用程序。

这是工作站和服务器垃圾回收的默认模式。 但是,如果托管应用,则托管进程的垃圾回收器设置优先。
LowLatency 对于具有短期、时间敏感操作的应用程序,在此期间,垃圾回收器的中断可能会造成干扰。 例如,呈现动画或数据收集函数的应用程序。
SustainedLowLatency 对于具有时间敏感操作且持续时间可能较长的应用程序,在此期间,垃圾回收器引起的中断可能会有干扰。 例如,当市场数据在交易时间发生变化时,需要快速响应时间的应用程序。

此模式会比其他模式产生更大的托管堆大小。 由于它不压缩托管堆,因此可能产生更多碎片。 确保有足够的内存可用。

使用低延迟指南

使用 GCLatencyMode.LowLatency 模式时,请考虑以下准则:

  • 尽可能短地保持低延迟的时间段。

  • 避免在低延迟期间分配大量内存。 由于垃圾回收回收的对象较少,因此可能会出现内存不足通知。

  • 在低延迟模式下,尽量减少新分配的数量,特别是对大型对象堆和固定对象的分配。

  • 知道可以分配的线程。 LatencyMode由于该属性设置适用于整个进程,OutOfMemoryException因此在任何进行分配的线程上都可能产生异常。

  • 将低延迟代码包装在受限的执行区域中。 有关详细信息,请参阅 约束的执行区域

  • 可以在低延迟期间,通过调用GC.Collect(Int32, GCCollectionMode) 方法强制第 2 代集合。

另请参阅