C# 试图了解ConcurrentQueue的内存消耗<;T>;
我有一个简单的生产者/消费者模式,生产者每1毫秒产生一次数据。消费者每3毫秒使用一次数据。因此,我需要一个队列来临时存储数据。直到现在一切都好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
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
}
}
现在我将解释我的问题:
- 应用程序启动时,内存使用情况如下所示:
- 生成数据几秒钟后,将显示以下内容:
queue.count==0
),应用程序的内存使用量也没有减少
此应用程序必须全天候运行并存储数百万条数据记录。因此,我将在几分钟/小时后耗尽内存。(在我计算的30分钟后,有一个生产中断,所有数据都应该出列,因此如果内存使用减少,它将工作)。
为什么每一项退出队列后内存都没有减少?
我测试了这个应用程序很多小时,内存消耗来自
\u queue.Enqueue(数据)代码>行。因此,我100%确信,没有其他代码对内存使用负责
甚至当我使用queue.clear()时代码>或强制GB.collect()
将所有项目出列后,内存使用情况仍然如下所示:
有人能解释一下C#中队列或ConcurrentQueue的内存使用情况吗?
为什么在所有项目出列后它不减少?
提前感谢。NET是一个垃圾收集环境。除非您的机器内存受限(事实并非如此),否则GC并不迫切需要启动并收集内存。你为什么要讨论这个问题?这感觉像是一个XY问题-。我的理解是正确的,可能是重复的:当我需要更多内存时,.NET的GC只收集未使用的项目?这意味着:我没有内存问题,因为当需要更多内存时,.NET GC将收集(旧的)未使用的项,而不分配更多内存?@mjwills这是一个问题,因为我认为当不清理对象时(尽管所有项都已出列),内存使用量将无限增长。我试图了解如何处理出列的对象。这与你的问题无关,但我个人更喜欢使用阻塞集合
来处理这种模式,这样就不需要线程。睡眠
不是很优雅,而且可能会花费一些时间。