C# 试图了解ConcurrentQueue的内存消耗<;T>;

C# 试图了解ConcurrentQueue的内存消耗<;T>;,c#,memory-management,memory-leaks,queue,C#,Memory Management,Memory Leaks,Queue,我有一个简单的生产者/消费者模式,生产者每1毫秒产生一次数据。消费者每3毫秒使用一次数据。因此,我需要一个队列来临时存储数据。直到现在一切都好 public Consumer() { _consumerThread = new Thread(new ThreadStart(consumeData)); _consumerThread.Start(); } 队列将被以下代码填充: private ConcurrentQueue<string> _queue = new

我有一个简单的生产者/消费者模式,生产者每1毫秒产生一次数据。消费者每3毫秒使用一次数据。因此,我需要一个队列来临时存储数据。直到现在一切都好

public Consumer()
{
    _consumerThread = new Thread(new ThreadStart(consumeData));
    _consumerThread.Start();
}
队列将被以下代码填充:

private ConcurrentQueue<string> _queue = new ConcurrentQueue<string>();

public void enqueueData(string data)
{
    _queue.Enqueue(data);
}
在这个类的构造函数中,我在存储第一条记录时启动线程来使用数据。直到现在都很简单

public Consumer()
{
    _consumerThread = new Thread(new ThreadStart(consumeData));
    _consumerThread.Start();
}
以下方法将使用数据并将其存储在数据库中:

private string _resultData = null;
private object _lock = new object();

private void consumeData()
{
    while(true)
    {
        while(_queue.Count > 0)
        {
            _resultData = null;
            if (_queue.TryDequeue(out _resultData))
            {
                lock(_lock)
                {
                    DataHandler.processData(_resultData); // this does the database stuff
                }
            }
        }
        Thread.Sleep(_sleeptime); // sleep 50ms 
    }
}
现在我将解释我的问题:

  • 应用程序启动时,内存使用情况如下所示:

  • 生成数据几秒钟后,将显示以下内容:

在这几秒钟内,我生成了大约50000条数据记录,这些记录都必须存储在数据库中。应用程序需要大约1分钟才能完成此任务

问题在于:即使所有数据记录都存储在数据库中(意味着
queue.count==0
),应用程序的内存使用量也没有减少

此应用程序必须全天候运行并存储数百万条数据记录。因此,我将在几分钟/小时后耗尽内存。(在我计算的30分钟后,有一个生产中断,所有数据都应该出列,因此如果内存使用减少,它将工作)。

为什么每一项退出队列后内存都没有减少?

我测试了这个应用程序很多小时,内存消耗来自
\u queue.Enqueue(数据)行。因此,我100%确信,没有其他代码对内存使用负责

甚至当我使用
queue.clear()时或强制
GB.collect()
将所有项目出列后,内存使用情况仍然如下所示:

有人能解释一下C#中队列或ConcurrentQueue的内存使用情况吗?

为什么在所有项目出列后它不减少?


提前感谢

。NET是一个垃圾收集环境。除非您的机器内存受限(事实并非如此),否则GC并不迫切需要启动并收集内存。你为什么要讨论这个问题?这感觉像是一个XY问题-。我的理解是正确的,可能是重复的:当我需要更多内存时,.NET的GC只收集未使用的项目?这意味着:我没有内存问题,因为当需要更多内存时,.NET GC将收集(旧的)未使用的项,而不分配更多内存?@mjwills这是一个问题,因为我认为当不清理对象时(尽管所有项都已出列),内存使用量将无限增长。我试图了解如何处理出列的对象。这与你的问题无关,但我个人更喜欢使用
阻塞集合
来处理这种模式,这样就不需要
线程。睡眠
不是很优雅,而且可能会花费一些时间。