2012-09-25 6 views
1

.Net AppDomain 클래스의 MonitoringSurvivedMemorySize 속성을 사용하려고합니다.AppDomain.MonitoringSurvivedMemorySize 예기치 않은 동작

내 응용 프로그램이이 속성에서받은 값이 msdn에 지정된 속성의 설명과 어떻게 일치 하는지를 볼 수 없다는 문제가 있습니다.

내가 알고있는 값을 반환하는 속성은 이전 호출에서 반환 한 값과 반환 값이 다르므로 너무 낮습니다. 두 호출간에 AppDomain에서 참조하는 메모리 양은 절대로 없었습니다 새로운 반환 값만큼 낮습니다.

"AppDomain Monitoring"에 대해 SO, google 및 connect.microsoft.com을 검색했지만 위에서 설명한이 특정 문제와 관련이있는 것으로 보이는 항목을 찾을 수 없습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WindowWidth = 133; 

     AppDomain.MonitoringIsEnabled = true; 

     var Queue = new Queue<byte[]>(); 

     var BlockSize = (int)1e+6; 

     var ToggleAllocation = true; 

     while (true) 
     { 
      if (Console.KeyAvailable) 
      { 
       var Input = Console.ReadKey(true); 

       if (Input.Key == ConsoleKey.Escape) 
       { 
        break; 
       } 

       if (Input.Key == ConsoleKey.C) 
       { 
        GC.Collect(); 
        Console.WriteLine("Collect"); 
       } 

       ToggleAllocation = !ToggleAllocation; 
      } 

      Thread.Sleep(100); 

      if (!ToggleAllocation) 
      { 
       continue; 
      } 

      Queue.Enqueue(new byte[BlockSize]); 

      while (100 < Queue.Count) 
      { 
       Queue.Dequeue(); 
      } 

      var ExpectedLowerBound = Queue.Count * BlockSize; 

      var MonitoringSurvivedMemorySize = AppDomain.CurrentDomain.MonitoringSurvivedMemorySize; 
      var MonitoringTotalAllocatedMemorySize = AppDomain.CurrentDomain.MonitoringTotalAllocatedMemorySize; 

      Console.WriteLine(
       "Queue.Count=" + Queue.Count.ToString() + 
       ", SurvivedMemorySize=" + MonitoringSurvivedMemorySize.ToString() + 
       ", TotalAllocatedMemorySize=" + MonitoringTotalAllocatedMemorySize.ToString() + 
       ", ExpectedLowerBound=" + ExpectedLowerBound.ToString()); 
     } 
    } 
} 

이 기능은 단순히 시간에서 확인하는 시간에 약간의 메모리를 할당 : 나는 다음과 같은 코드로 새로운 ConsoleApplication을 만들어이 내 응용 프로그램의 다른 부분과 아무것도 할되지 않은 있는지 확인하려면

gc가 결국 발생하고 MonitoringSurvivedMemorySize가받은 값을 인쇄합니다.

일부 디버거 "기능"으로 인한 문제가 아닌지 확인하기 위해 프로젝트를 기본 릴리스 구성으로 전환하고 탐색기에서 programm를 실행했습니다.

이 프로그램을 실행하면 MonitoringSurvivedMemorySize이 일부 반복에 대해 0을 반환하고, 일부 반복 (첫 번째 Gc 이후에 가정)에서 내 기대치를 충족시키는 높은 값을 반환합니다. 그러나 반복을 몇 번 반복하면 반환 값이 0으로 돌아갑니다. 또한 0과는 다른 값을 반환하지만 때로는 멀리까지 값을 반환합니다.

나는 ".NET 프레임 워크 4 클라이언트 프로파일"내가 잘못 뭐하는 거지

에 대상 프레임 워크를 설정?

재현 할 수 있습니까?

답변

0

.NET Framework 4.5를 사용하여 같은 문제가 발생하여 Microsoft에서 버그로 제출했습니다. 은 이제 그들은 답을 제공하고 고정 된 마이크로 소프트의 티켓

링크 (.NET 프레임 워크 4.5) : http://connect.microsoft.com/VisualStudio/feedback/details/765296/appdomain-monitoringsurvivedmemorysize-property-returns-wrong-value-after-gen-0-collection 견적은 아래 위에 링크 된 페이지에서 유래

:

이되었다 GC 버그가 아니라 문서화 버그. http://msdn.microsoft.com/library/system.appdomain.monitoringsurvivedmemorysize(v=vs.110).aspx 에서 문서 읽을 수정 :

은 "통계는 각 가비지 컬렉션 업데이트됩니다 그러나, 그들은 수집을 차단하고, 단지 전체 후에 정확성을 보장, 즉, 모음입니다. 모든 세대가 포함되며 수집 중에 응용 프로그램을 중지하는 이 포함됩니다 (예 : GC).Collect() 메서드 오버로드는 전체 블로킹 컬렉션을 수행합니다. (동시 수집은 백그라운드에서 발생하고 응용 프로그램을 차단하지 않습니다.) "

--Ron는 Petrusha 공용 언어 런타임 사용자 교육 마이크로 소프트

을 인하여 내가 삼가하겠습니다 관찰 긴 응답 시간 Microsoft에서 .NET 4.0에 대한 설명을 요구하는 대신 이에 의해 OP에 대한 유효한 대답으로이를 강력히 선언합니다.

0

제공 한 링크의 설명서에 따르면 전체 차단 수집 후에 만 ​​업데이트 된 통계가 제공됩니다. 테스트 장비에 GC.Collect에 전화를 걸어보십시오.

+0

내가 이미 언급 한 종속성을 설명했습니다. 문제가 잘못된 시간에 업데이트되는 것이 아닙니다. 하지만 그것은 잘못된 값으로 업데이 트하고 있습니다. 나는 GC.Collect에 대한 호출을 코드에 추가했습니다 (그리고 upd 그에 따라 첫 번째 게시물을 ated) 여기에 무슨 일이 일어 났는가 : 내가 GC.Collect를 호출하면 Property는 강제 수집 후 일부 호출에 대해 합리적인 값을 반환하지만 나중에 다시 0을 반환합니다. 어쩌면 강제 컬렉션이 어떤 종류의 해결 방법으로 사용될 수 있습니다. –

+0

아마 우리는 뭔가를 놓치고 있습니다. GC 차단 콜렉션 전에 알림 등록을 시도하십시오. 이것 좀 봐 : http://msdn.microsoft.com/en-us/library/cc713687.aspx –