2010-05-20 166 views
1

据我了解,垃圾收集器会随着应用程序的运行而自行调整,例如,当收集托管堆上的对象时,会随着时间调整(根据MSDN)。垃圾收集器是否有配置?

如果应用程序崩溃,运行时是否记住它是以前的垃圾回收“设置”或其他设置?

回答

6

是的,垃圾收集器算法中有一种启发式方法,它可以自动调整分配策略。这种最明显的副作用是随着程序运行和消耗内存,看到第0代堆大小在增加。通常从2 MB开始,如果程序快速消耗内存,它可能会达到〜8 MB。在Perfmon.exe中可见的性能计数器对此很有帮助。

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

启发式的细节没有记录。但是,您可以从今天的出版社收集软件算法文档的一些背景信息,即美国专利局。大多数微软的GC算法专利都归功于Patrick Dussud,您可以通过谷歌查询名称轻松找到他们。这里是a relevant one

5

不,运行时不会记住它在运行过程中学到的以前的垃圾回收“设置”。

什么,你可以配置为并发垃圾回收将通过配置文件中的以下内容:

<configuration> 
    <runtime> 
     <gcServer enabled="true"/> 
    </runtime> 
</configuration> 

或者:

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

为gcServer全部文档可以在MSDN找到。

gcConcurrent的完整文档可在MSDN中找到。

+0

它是''元素实际上。服务器GC是一种非常不同的算法。 – 2010-05-20 13:59:55

+0

我已将我的答案更新为包含gcConcurrent。 – brickner 2010-05-20 15:11:23