【发布时间】:2011-05-26 23:45:04
【问题描述】:
我想弄清楚一个奇怪的情况。
创世纪:
我在具有 16 个内核和 128GB 内存的物理机器上运行我的程序。我试图确定为什么它没有使用所有可用的内核,通常它平均使用 20-25% 的 CPU(所以 16 个内核中有 4-5 个)。当我查看性能计数器时,它们显示的垃圾收集时间大约为 60-70%。
作为参考,我正在使用 .NET Framework 4 和 TPL (Parallel.ForEach) 来处理我的程序的性能密集型部分。我将线程数限制为内核数。
问题:
我正在创建大量对象,对于垃圾收集器来说太多了,无法有效处理,因此它在垃圾收集器中花费了大量时间。
迄今为止的简单解决方案:
我正在引入对象池来减少垃圾收集器的压力。我将继续池化对象以提高性能,已经将一些对象池化将垃圾收集的时间从 60-70% 减少到 45%,并且我的程序运行速度提高了 40%。
烦人的问题(希望你能帮我解答):
我的程序在运行时最多使用 14GB 的可用 RAM,与 128GB 的 RAM 相比,这非常小。这台机器上没有运行其他任何东西(对我来说它纯粹是一个测试平台)并且有大量可用的 RAM。
- 如果有大量可用 RAM,为什么会发生任何 gen2(或完整)集合?相当大量的这些 gen2 集合(数以千计)正在发生。即如何确定开始 gen2 收集的阈值?
- 为什么垃圾收集器不简单地延迟任何完整的收集,直到物理 RAM 上的压力达到更高的阈值?
- 有什么方法可以配置垃圾收集器等待更高的阈值? (即如果没有必要,根本不用费心收集)
编辑:
我已经在使用使用服务器垃圾收集器的选项...我需要知道的是什么触发了 gen2 收集,而不是服务器垃圾收集器更好(我已经知道了)。
【问题讨论】:
标签: .net memory-management c#-4.0 garbage-collection