据我所知,垃圾回收器会随着应用程序的运行进行自我调整,例如,当托管堆中的对象被收集时使用的阈值会根据时间进行调整(根据MSDN的说法)。
如果应用程序崩溃了,运行时是否会记住其先前的垃圾收集“设置”或其他设置?
如果应用程序崩溃了,运行时是否会记住其先前的垃圾收集“设置”或其他设置?
是的,垃圾收集器算法中有一种启发式方法,使其自动调整分配策略。最明显的副作用是在程序运行并消耗内存时看到 gen 0 堆大小增长。通常从2 MB开始,如果程序迅速消耗内存,它可以达到约8 MB。在 Perfmon.exe 中可见的性能计数器对此非常有用。
重点非常在于“自动”,这段代码的编写完全基于这样一个假设:程序员没有足够的信息来正确地引导算法。唯一的“钩子”是GC无法知道的东西,比如非托管内存使用(GC.AddMemoryPressure)或程序的角色(app.exe.config)。
这种启发式方法的细节未经记录。但是,您可以从今天的软件算法文档出版社——美国专利局——中获得一些背景信息。大多数微软的GC算法专利都归功于Patrick Dussud,您可以通过他的姓名轻松找到它们。这里是一个相关的专利。
<gcConcurrent>
元素。服务器 GC 是一种非常不同的算法。 - Hans Passant