2017-12-31 68 views
1

MemoryCache 클래스가 작동하는 방식은 CachePolicy가 여전히 충족되어 있고 메모리 조건이 허용하는 한 메모리에 저장 한 내용을 유지하는 것이라고 생각했습니다.메모리가 부족할 때 MemoryCache에서 항목을 비우지 않는 이유는 무엇입니까?

일부 테스트를 실행 한 후 메모리 조건이 낮을 때 MemoryCache가 어떤 조치를 취했는지 확신 할 수 없습니다.

나는 콘솔 응용 프로그램에서 다음 코드를 실행할 수 있습니다

 MemoryCache cache = MemoryCache.Default; 
     CacheItemPolicy p = new CacheItemPolicy() 
     { 
      AbsoluteExpiration = ObjectCache.InfiniteAbsoluteExpiration 
     }; 

     for (int i=0; i < 1000000; i++) 
     { 
      Console.WriteLine(i); 
      string s = new string('0', 50000); 
      cache.Add(new CacheItem(i.ToString(), s), p); 
     } 

에 대한 30K 반복 한 후, 나는 System.OutOfMemoryException 얻을.

MemoryCache와 GC가 메모리 조건이 낮을 때 저장된 객체를 해제하지 않는 이유는 무엇입니까?

답변

1

CacheMemoryLimitMegabytes 속성 또는 PhysicalMemoryLimitPercentage 속성을 확인해야합니다.

그러나 이전 버전의 MemoryCache에서는 메모리 부족을 검사하는 방법에 문제가보고되었습니다. 들으세요. this question

+0

캐시 삭제시 콜백을 추가했는데이를 알려주고 있습니다. 처리되지 않은 OutOfMemoryException이 throw되면 MemoryCache가 항목 삭제를 시작합니다. 물론 그때까지는 너무 늦었습니다. outofMemoryException을 처리하기 위해 try catch 블록을 추가하면 MemoryCache는 더 이상 항목을 삭제하지 않습니다. – Aheho

+1

관찰이 행동을 변화시키는 것은 양자 입자 물리학과 같습니다. – Aheho