문제

내 자신의 .Net 서버 프로세스가 (모니터링 및 로깅 목적으로) 사용중인 메모리 양을 찾으려고합니다.

사용중인 항목 : 라코 디스

그러나 Process 객체에는 사용 된 메모리 공간을 읽을 수있는 몇 가지 다른 속성이 있습니다. Paged, NonPaged, PagedSystem, NonPagedSystem, Private, Virtual, WorkingSet

그리고 "피크": 마지막 값이 취한 최대 값을 저장하는 것 같습니다.

각 속성의 MSDN 정의를 읽는 것이 나에게 그다지 도움이되지 않았습니다. 메모리 관리 방법 (페이징과 가상이 진행되는 한)에 대한 내 지식은 매우 제한적이라는 것을 인정해야합니다.

내 질문은 분명히 "어떤 것을 사용해야합니까?"이고 대답은 "에 따라 다릅니다"라는 것을 알고 있습니다.

이 프로세스는 기본적으로 진행중인 일에 대한 메모리에 많은 목록을 보유하고 다른 프로세스는이 프로세스와 통신하고 항목을 쿼리합니다. 나는 이것이 실행될 서버가 많은 RAM을 필요로 할 것으로 예상하고 있으므로 내부에 보관하는 목록의 크기와 비교할 때 RAM 요구 사항을 추정 할 수 있도록 시간이 지남에 따라이 데이터를 쿼리하고 있습니다.

그래서 ... 어떤 것을 사용해야하며 그 이유는 무엇입니까?

도움이 되었습니까?

해결책

GC가 얼마나 많이 사용하는지 알고 싶다면 try : 라코 디스

프로세스가 Windows (TaskManager의 VM 크기 열)에서 무엇을 사용하는지 알고 싶다면 다음을 시도하십시오. 라코 디스

페이지 파일이 아닌 RAM에서 프로세스가 무엇을 가지고 있는지 알고 싶다면 (TaskManager의 Mem Usage 열) 다음을 시도하십시오. 라코 디스

자세한 내용은 여기 를 참조하십시오.다양한 종류의 기억

다른 팁

좋습니다. 저는 Lars가 언급 한 것과 동일한 페이지를 Google을 통해 찾았습니다. 저처럼 메모리가 어떻게 작동하는지 잘 모르는 사람들에게 훌륭한 설명이라고 생각합니다.

http://shsc.info/WindowsMemoryManagement

짧은 결론은 다음과 같습니다.

  • Private Bytes= 프로세스가 데이터를 저장하기 위해 요청한 메모리.일부는 디스크로 페이징되거나 그렇지 않을 수 있습니다.이것이 제가 찾고 있던 정보입니다.

  • Virtual Bytes= Private Bytes 및로드 된 DLL 등을 위해 다른 프로세스와 공유하는 공간

  • Working Set= 디스크에 페이징되지 않은 내 프로세스의 모든 메모리 부분.따라서 디스크에 페이징되는 양은 (가상-작업 집합)이어야합니다.

    도움을 주셔서 감사합니다!

Process Explorer "WS Private Bytes"에 해당하는 Windows Vista 작업 관리자에 표시된 "메모리 (Private Working Set)"를 사용하려는 경우 다음 코드가 있습니다.실시간 통계를 위해 스레드 / 백그라운드 작업에서이 무한 루프를 던지는 것이 가장 좋습니다. 라코 디스

작업 관리자가 제공하는 가치를 얻으려면 위의 Mike Regan의 솔루션을 사용합니다.그러나 한 가지 변경 사항은 다음과 같습니다 : perfCounter.NextValue()/1000;가 아니라 perfCounter.NextValue()/1024; (즉, 실제 킬로바이트).이것은 작업 관리자에 표시되는 정확한 값을 제공합니다.

다음은 WPF 또는 WinForms 앱에서 간단한 방식으로 (이 경우 단순히 제목에) '메모리 사용량'(주어진 작업 관리자)을 표시하는 완전한 솔루션입니다.새 Window 생성자 내에서이 메서드를 호출하면됩니다. 라코 디스

작업 세트는 사용하기에 좋은 속성이 아닙니다.내가 수집 한 내용에는 프로세스가 다룰 수있는 모든 것이 포함되며, 심지어 여러 프로세스에서 공유하는 라이브러리도 포함되므로 해당 카운터에서 이중 계산 된 바이트를 볼 수 있습니다.개인 메모리는 살펴보기에 훨씬 더 나은 카운터입니다.

페이지 오류가 발생하는 빈도도 모니터링하는 것이 좋습니다.페이지 오류는 물리적 메모리에서 스왑 파일로 이동 된 일부 데이터에 액세스하려고 할 때 발생하며 시스템은이 데이터에 액세스하기 전에 디스크에서 페이지를 읽어야합니다.

공정한 설명입니까? 이 내용을 저희 팀과 공유하고 싶습니다. 정확하지 않거나 불완전한 경우 알려주세요.

내 프로세스가 사용중인 메모리 양을 묻는 C #에는 여러 가지 방법이 있습니다.

  • 할당 된 메모리는 CLR에 의해 관리되거나 관리되지 않을 수 있습니다.
  • 할당 된 메모리는 가상 (디스크에 저장) 또는로드 (RAM 페이지에) 일 수 있습니다.
  • 할당 된 메모리는 비공개 (프로세스에서만 사용) 또는 공유 (예 : 다른 프로세스가 참조하는 DLL에 속) 일 수 있습니다.

    위에서 볼 수 있듯이 다음은 C #에서 메모리 사용량을 측정하는 몇 가지 방법입니다.

    1) Process.VirtualMemorySize64 () : 관리 또는 비 관리, 가상 또는로드, 개인 또는 공유 등 프로세스에서 사용하는 모든 메모리를 반환합니다.

    2) Process.PrivateMemorySize64 () : 프로세스에서 사용하는 모든 개인 메모리 (관리 또는 비 관리, 가상 또는로드)를 반환합니다.

    3) Process.WorkingSet64 () : 프로세스에서 사용하는로드 된 모든 개인 메모리 (관리 또는 비 관리)를 반환합니다.

    4) GC.GetTotalMemory () : 가비지 수집기가 감시하는 관리 메모리 양을 반환합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top