실험을 위해 BlockingCollection을 사용하여 프로듀서/소비자 패턴을 구현했습니다. 실행 후GC가 사용하지 않는 개체를 수집하지 않는 이유는 무엇입니까?
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");
}
내 메모리 덤프 :
start
211908
now
211972
now
212208
now
212280
now
212596
now
212736
now
212712
now
212856
now
212840
now
212976
now
213036
end
213172
내 메모리를 소모하기 전에 21만1천9백8킬로바이트를이지만, 다른 스레드에서 생산하면서 하나씩 증가했다.
GC는 메모리에서 생성 된 객체를 수집하지 않습니다. 생산자/소비자 패턴을 구현했지만 왜 내 기억력이 증가 했습니까?
통화를 삭제하거나 사용하는 것이 표시되지 않습니다. 컬렉션에 항목을 추가하고 절대로 제거하지 않는 것을 보았습니다. 나는 그 문제가 무엇인지, 또는 당신이 성취하려는 것을 이해하지 못합니다. – Origin
나는 당신이 무엇을 기대하고 있는지 정말로 이해하지 못합니까? – Tudor
출처 : 생산자/소비자 패턴이므로 목록에서 항목을 제거 할 필요가 없습니다. GetConsumingEnumerable()이 (가) 나를 위해 항목을 제거합니다. – oguzh4n