垃圾收集器有配置选项吗?

5
据我所知,垃圾回收器会随着应用程序的运行进行自我调整,例如,当托管堆中的对象被收集时使用的阈值会根据时间进行调整(根据MSDN的说法)。
如果应用程序崩溃了,运行时是否会记住其先前的垃圾收集“设置”或其他设置?
3个回答

9

是的,垃圾收集器算法中有一种启发式方法,使其自动调整分配策略。最明显的副作用是在程序运行并消耗内存时看到 gen 0 堆大小增长。通常从2 MB开始,如果程序迅速消耗内存,它可以达到约8 MB。在 Perfmon.exe 中可见的性能计数器对此非常有用。

重点非常在于“自动”,这段代码的编写完全基于这样一个假设:程序员没有足够的信息来正确地引导算法。唯一的“钩子”是GC无法知道的东西,比如非托管内存使用(GC.AddMemoryPressure)或程序的角色(app.exe.config)。

这种启发式方法的细节未经记录。但是,您可以从今天的软件算法文档出版社——美国专利局——中获得一些背景信息。大多数微软的GC算法专利都归功于Patrick Dussud,您可以通过他的姓名轻松找到它们。这里是一个相关的专利


5
不,运行时不会记住在运行期间学到的以前的垃圾回收“设置”。
您可以通过在配置文件中添加以下内容来配置并发垃圾回收:
<configuration>
   <runtime>
      <gcServer enabled="true"/>
   </runtime>
</configuration> 

或者:

<configuration>
   <runtime>
      <gcConcurrent enabled="false"/>
   </runtime>
</configuration>

您可以在MSDN中找到有关gcServer的完整文档。

您可以在MSDN中找到有关gcConcurrent的完整文档。


1
这实际上是 <gcConcurrent> 元素。服务器 GC 是一种非常不同的算法。 - Hans Passant

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接