为什么GC不收集未使用的对象
本文关键字:未使用 对象 GC 为什么 | 更新日期: 2023-09-27 18:19:09
我在实验中用BlockingCollection实现了生产者/消费者模式
PerformanceCounter c = null;
void Main()
{
var p =System.Diagnostics.Process.GetCurrentProcess();
c = new PerformanceCounter("Process", "Working Set - Private", p.ProcessName);
(c.RawValue/1024).Dump("start");
var blocking = new BlockingCollection<Hede>();
var t = Task.Factory.StartNew(()=>{
for (int i = 0; i < 10000; i++)
{
blocking.Add(new Hede{
Field = string.Join("",Enumerable.Range(0,100).Select (e => Path.GetRandomFileName()))
});
}
blocking.CompleteAdding();
});
var t2 = Task.Factory.StartNew(()=>{
int x=0;
foreach (var element in blocking.GetConsumingEnumerable())
{
if(x % 1000==0)
{
(c.RawValue/1024).Dump("now");
}
x+=1;
}
});
t.Wait();
t2.Wait();
(c.RawValue/1024).Dump("end");
}
My memory dump after run:
start
211908
now
211972
now
212208
now
212280
now
212596
now
212736
now
212712
now
212856
now
212840
now
212976
now
213036
end
213172
我的内存在消耗之前是211908kb,但是在从其他线程生产时它一个接一个地增加。
GC没有从内存中收集生成的对象。为什么我的内存增加,虽然实现生产者/消费者模式?
BlockingCollection<T>
默认使用的ConcurrentQueue<T>
在。net 4.0中包含内存泄漏。我不确定这是不是你正在观察的问题,但它可能是。
Garbage Collector不会一直自动释放内存。你可以在处理完未使用的对象后调用GC.Collect();
来强制垃圾回收