我正在调查服务器.NET应用程序内存占用的缓慢而稳定的增长。为了便于调查,我对6个客户进行了压力测试,模拟了实际负载,一遍又一遍地重复相同的使用模式。
当我一夜之间跑过来时,我可以看到内存占用大约几百MB。在分析和比较相隔12小时的服务器内存快照时,结果表明大部分差异是由于ReaderWriterLock
实例在终结器队列中等待。有超过6,000,000个!?!
分析我的代码并查看GC根据后发现,所有ReaderWriterLock
实时实例都来自我们软件中的DataSet
个实例。所以,我去了DataSet
实例创建,试图尽可能地消除它。在清理了一些代码并缓存了一些DataSet
实例以避免不必要的分配后,差异减少了大约25%,但看起来有更多。
我的问题是:
DataSet
个实例上调用dispose?请注意,我正在使用' Server'模式GC,因为我们的服务器会在不同的线程上并行处理请求。
答案 0 :(得分:0)
虽然我还没弄清楚为什么终结器队列中有这么多ReaderWriterLock
个实例,但我确实找到了解决问题的办法并摆脱了它们。
致电DataSet.Dispose
没有帮助。因此,我已经开始重复使用现有的DataSet
个实例,而不是继续创建新的实例,因为有人说DataSet.Clear
很慢' - 从长远来看,它不是(如果有的话)。
此方法完全消除了终结器队列实例的问题。