抑制C#垃圾回收

Fan*_*ius 11 c# garbage-collection

我的应用程序分配了大量的内存(数百万个小对象,总计几千兆字节)并且长时间保留它.

  1. 是.NET浪费时间检查所有这些数据来做GC吗?
  2. Gen 2 GC多久出现一次(检查所有对象的那个)?
  3. 有没有办法降低它的频率或暂时抑制它的发生?
  4. 我确切地知道当我准备好收集大量内存时,有什么方法可以优化它吗?我目前正在调用GC.Collect(); GC.WaitForPendingFinalizers(); 那时候.

更新:Perf计数器"GC中的%时间"显示平均值为10.6%.

Wel*_*bog 24

除非您可以确认垃圾收集器正在积极地降低应用程序的性能,否则您不应采取措施来削弱运行时环境的功能.

从您的问题判断,您尚未确认GC是一个问题.我严重怀疑它是.

仅优化需要优化的内容.

  • Perf计数器"GC中的%时间"平均显示为10.6%. (3认同)
  • 您可以更改应用程序的流程,以便对象要么很快被销毁(在第 0 代收集中),要么在整个应用程序生命周期中一直存在,因此根本不会被收集。 (2认同)

lep*_*pie 9

看看System.Runtime.GCSettings.LatencyMode酒店.

在app.config中将GCServer属性设置为true也有助于减少GC(在我的情况下,启用时减少10倍GC).


Ken*_*isa 9

您可以使用静态方法阻止垃圾收集器完成任何对象:

GC.SuppressFinalize(*your object*)
Run Code Online (Sandbox Code Playgroud)

更多信息: 链接文字

  • 在阅读有关此功能时,听起来并不会阻止GC检查对象是否准备好被收集.相反,它听起来像是在收集对象时禁止调用Finalize.非常不一样. (11认同)

Jac*_*ing 7

您可以使用性能监视器进行测量.打开perfmon并添加与.NET CLR Memory相关的性能计数器.这些计数器是特定于流程的,通过它们,您可以跟踪各代的集合数和大小,并且更加特别地为您指定"GC中的%时间".以下是此计数器的说明文字:

GC中的%时间是自上一个GC循环以来执行垃圾收集(GC)所花费的时间百分比.此计数器通常表示垃圾收集器代表应用程序收集和压缩内存所做的工作.此计数器仅在每个GC结束时更新,计数器值反映最后观察到的值; 它不是一般的.

如果您在运行程序时观察这些计数器,则应该根据您的内存决策来回答GC的频率和成本.

以下是各种GC性能计数器的良好讨论.似乎10%的边界没问题.