GC终结器队列中的大量对象

时间:2015-12-14 18:52:00

标签: c# .net garbage-collection server

我正在调查服务器.NET应用程序内存占用的缓慢而稳定的增长。为了便于调查,我对6个客户进行了压力测试,模拟了实际负载,一遍又一遍地重复相同的使用模式。 当我一夜之间跑过来时,我可以看到内存占用大约几百MB。在分析和比较相隔12小时的服务器内存快照时,结果表明大部分差异是由于ReaderWriterLock实例在终结器队列中等待。有超过6,000,000个!?!

分析我的代码并查看GC根据后发现,所有ReaderWriterLock实时实例都来自我们软件中的DataSet个实例。所以,我去了DataSet实例创建,试图尽可能地消除它。在清理了一些代码并缓存了一些DataSet实例以避免不必要的分配后,差异减少了大约25%,但看起来有更多。

我的问题是:

  1. 为什么终结器队列中有这么多实例 - 不确定是什么导致了这个?
  2. 我认为终结器队列的大小会对GC和整体应用程序性能产生负面影响(一段时间后我看起来很慢)?
  3. 我应该怎么做才能减少终结队列的大小?在我不再需要的每个DataSet个实例上调用dispose?
  4. 请注意,我正在使用' Server'模式GC,因为我们的服务器会在不同的线程上并行处理请求。

1 个答案:

答案 0 :(得分:0)

虽然我还没弄清楚为什么终结器队列中有这么多ReaderWriterLock个实例,但我确实找到了解决问题的办法并摆脱了它们。

致电DataSet.Dispose没有帮助。因此,我已经开始重复使用现有的DataSet个实例,而不是继续创建新的实例,因为有人说DataSet.Clear很慢' - 从长远来看,它不是(如果有的话)。 此方法完全消除了终结器队列实例的问题。