.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 클라이언트 프로파일"내가 잘못 뭐하는 거지에 대상 프레임 워크를 설정?
재현 할 수 있습니까?
내가 이미 언급 한 종속성을 설명했습니다. 문제가 잘못된 시간에 업데이트되는 것이 아닙니다. 하지만 그것은 잘못된 값으로 업데이 트하고 있습니다. 나는 GC.Collect에 대한 호출을 코드에 추가했습니다 (그리고 upd 그에 따라 첫 번째 게시물을 ated) 여기에 무슨 일이 일어 났는가 : 내가 GC.Collect를 호출하면 Property는 강제 수집 후 일부 호출에 대해 합리적인 값을 반환하지만 나중에 다시 0을 반환합니다. 어쩌면 강제 컬렉션이 어떤 종류의 해결 방법으로 사용될 수 있습니다. –
아마 우리는 뭔가를 놓치고 있습니다. GC 차단 콜렉션 전에 알림 등록을 시도하십시오. 이것 좀 봐 : http://msdn.microsoft.com/en-us/library/cc713687.aspx –