[c#] 동시에 발생하는 가비지 수집으로 인한 Net 4 MemoryCache 누수



1 Answers

세계에서 멈추는 쓰레기 수거는 세계가 멈추어 진 시점에서 물체에 대한 강력한 살아있는 참조가 존재하는지 여부를 판단하는 데 기반을두고 있습니다. 동시 가비지 수집은 일반적으로 과거의 특정 시간 이후 객체에 대한 강력한 실시간 참조가 있었는지 여부를 결정합니다. 나의 추측은 WeakReferences에 포함 된 객체에 대한 많은 강력한 참조가 개별적으로 생성되고 폐기된다는 것입니다. 세계에서 가비지 컬렉터가 특정 오브젝트가 작성된 시간과 폐기 될 때 사이에 중지되면 특정 오브젝트가 활성 상태로 유지되지만 이전에 폐기 된 오브젝트는 유지되지 않습니다. 대조적으로 동시 가비지 수집기는 생성되는 객체에 대한 강력한 참조없이 일정 시간이 지나기 전까지 객체가 삭제 된 모든 강력한 참조를 감지하지 못할 수 있습니다.

때로는 .net이 강력한 참조와 약한 것 사이에 무언가를 제공하여 객체가 메모리에서 지워지는 것을 막을 수는 있지만 객체가 완결되거나 약한 WeakReferences가 무효화되는 것을 막지는 않을 것이라고 생각했습니다. 이러한 참조는 GC 프로세스를 약간 복잡하게 만들므로 모든 객체에 강하고 준 약 참조가 있는지 여부와 강한 참조와 준 약 참조를 모두 스캔했는지 여부를 나타내는 별도의 플래그가 필요하지만 이러한 기능은 도움이 될 수 있습니다 많은 "약한 사건"시나리오에서

Question

나는 새로운 메모리 캐시를 닷넷 4에서 사용하고 있는데, 최대 캐시 크기 제한은 MB이다 (나는 1.75에서 8GB 사이의 메모리를 가진 시스템에서 10에서 200MB 사이의 값으로 테스트했다). 나는 단순히 캐시를 고성능 드라이브로 사용하고 있으므로 오브젝트에 만료 시간을 설정하지 않으며 공간이있는 한이를 사용하고 싶습니다. 놀랍게도, 캐시는 SystemOutOfMemory 예외가 발생하기까지 모든 객체를 제거하는 것을 거부했습니다 .

나는 .Net CLR Memory\#Bytes In All Heaps 응용 프로그램을 유선으로 .Net CLR Memory\#Bytes In All Heaps 했다 .Net CLR Memory\#Bytes In All Heaps , .Net Memory Cache 4.0 , Process\Private Bytes - 실제로 메모리 소비는 통제 할 수 없으며 캐시 정리가 수행되지 않았다. 등기.

인터넷 검색MemoryCache , MemoryCache 다운로드하고 첨부 MemoryCache , MemoryCache 소리 : 모든 곳으로의 퇴거가 MemoryCache . 메모리는 합리적인 범위 내에서 내가 설정했던 메모리 크기 제한을 기반으로했습니다. 디버그 모드에서 다시 실행하십시오. CLRProfiler 다시, 퇴거.

마침내 프로파일 러가 동시 가비지 콜렉션 없이 응용 프로그램을 실행하도록 강요 했습니다 (유용한 SO 동시 가비지 콜렉션 질문 참조 ). 나는 내 app.config에서 그것을 껐다. 그리고, 충분히, 퇴거시켰다!

이는 말도 안되는 문서의 터무니없는 부족처럼 보입니다. 이것은 동시 가비지 수집이 아닌 경우에만 작동합니다. ASP.NET에서 이식 된 이후의 이미지이지만 동시 가비지 수집에 대해 걱정할 필요가 없을 수도 있습니다 .

그래서 다른 사람이 이것을 보았습니까? 나는 다른 어떤 경험을 거기 밖으로 얻고 싶습니다. 그리고 어쩌면 좀 더 교육받은 통찰력을 얻고 싶습니다.

업데이트 1

나는 한 가지 방법으로 문제를 재현 해 냈다. 동시 가비지 수집 모드에서 실행하지 않는 캐시 축출에 대해 캐시를 병렬로 작성해야하는 것으로 보인다. 관심이 있다면 테스트 코드를 공용 repo에 업로드합니다. CLR / GC / MemoryCache 풀의 끝까지 확실히 다가 가고 있습니다. 플로트를 잊어 버렸습니다.

업데이트 2

문제를 재현하기 위해 CodePlex테스트 코드를 게시했습니다. 또한 원래의 생산 코드는 Azure에서 Worker Role로 실행됩니다. 흥미롭게도 역할의 app.config에서 GC 동시성 설정을 변경해도 아무런 효과가 없습니다. Azure가 ASP.NET과 비슷한 GC 설정을 무시할 가능성이 있습니까? 또한 WPF 대 콘솔 응용 프로그램에서 테스트 코드를 실행하면 약간 다른 퇴거 결과가 생성됩니다.




MemoryCache 확실히 몇 가지 문제가 있습니다. 그것은 asp.net 서버에서 160MB의 메모리를 먹었고 단순한 목록으로 바뀌었고 동일한 기능을 사용하기 위해 몇 가지 추가 로직이 추가되었습니다.






Related