개인 바이트, 가상 바이트, 작업 집합이란 무엇입니까?
perfmon Windows 유틸리티를 사용하여 프로세스에서 메모리 누수를 디버깅하려고합니다.
이것이 perfmon이 용어를 설명하는 방법입니다.
작업 집합 은이 프로세스의 작업 집합의 현재 크기 (바이트)입니다. 작업 집합은 프로세스의 스레드가 최근에 건드린 메모리 페이지 집합입니다. 컴퓨터의 여유 메모리가 임계 값을 초과하면 페이지가 사용 중이 아니더라도 프로세스의 작업 집합에 남아 있습니다. 여유 메모리가 임계 값 아래로 떨어지면 작업 세트에서 페이지가 잘립니다. 필요한 경우 메인 메모리를 떠나기 전에 작업 세트로 다시 소프트 폴트됩니다.
Virtual Bytes 는 프로세스가 사용중인 가상 주소 공간의 현재 크기 (바이트)입니다. 가상 주소 공간을 사용한다고해서 반드시 디스크 또는 주 메모리 페이지를 사용하는 것은 아닙니다. 가상 공간은 한정되어 있으며 프로세스는 라이브러리로드 기능을 제한 할 수 있습니다.
Private Bytes 는 다른 프로세스와 공유 할 수없는이 프로세스가 할당 한 메모리의 현재 크기 (바이트)입니다.
내가 가진 질문은 다음과 같습니다.
공유 라이브러리를 포함하지 않고 누출이 발생하는 경우 프로세스 자체에서 발생하므로 프로세스에 누출이 있는지 확인하기 위해 측정해야하는 개인 바이트입니까?
프로세스에서 사용하는 총 메모리는 얼마입니까? 가상 바이트입니까, 아니면 가상 바이트와 작업 세트의 합계입니까?
Private Bytes, Working Set 및 Virtual Bytes 사이에 관계가 있습니까?
메모리 사용량에 대한 더 나은 아이디어를 제공하는 다른 도구가 있습니까?
이 질문에 대한 짧은 대답 은 이러한 값 중 어느 것도 실행 파일이 실제로 사용하고있는 메모리 양을 신뢰할 수있는 지표가 아니며 메모리 누수를 디버깅하는 데 실제로 적합하지 않다는 것입니다.
Private Bytes 는 프로세스 실행 파일이 요청한 메모리 양을 의미하며 반드시 실제로 사용 하고있는 양은 아닙니다 . 일반적으로 메모리 매핑 된 파일 (예 : 공유 DLL)을 제외하기 때문에 "개인"입니다. 하지만 여기에 캐치가 있습니다 . 이러한 파일에 의해 할당 된 메모리를 반드시 제외하지는 않습니다 . 개인 바이트의 변경이 실행 파일 자체 때문인지 링크 된 라이브러리 때문인지 알 수있는 방법이 없습니다. 개인용 바이트는 배타적으로 물리적 메모리가 아닙니다 . 디스크 또는 대기 페이지 목록에 페이징 될 수 있습니다 (예 : 더 이상 사용되지 않지만 아직 페이징되지 않음).
작업 세트 는 프로세스에서 사용 하는 총 실제 메모리 (RAM)를 나타냅니다 . 그러나 개인 바이트와 달리 여기에는 메모리 매핑 된 파일 및 다양한 기타 리소스도 포함되므로 개인 바이트보다 훨씬 덜 정확한 측정입니다. 이것은 작업 관리자의 "Mem Usage"에보고 된 것과 동일한 값이며 최근 몇 년 동안 끝없는 혼란의 원인이되었습니다. 작업 집합의 메모리는 페이지 오류없이 주소를 지정할 수 있다는 점에서 "물리적"입니다. 그러나 대기 페이지 목록 도 여전히 물리적으로 메모리에 있지만 작업 집합에는보고되지 않으므로 응용 프로그램을 최소화 할 때 "Mem Usage"가 갑자기 떨어질 수 있습니다.
가상 바이트 는 전체 프로세스가 차지하는 총 가상 주소 공간 입니다. 이것은 메모리 매핑 된 파일 (공유 DLL)을 포함한다는 점에서 작업 세트와 비슷하지만 대기 목록의 데이터와 이미 페이지 아웃되어 디스크의 페이지 파일 어딘가에있는 데이터도 포함합니다. 부하가 높은 시스템의 모든 프로세스에서 사용되는 총 가상 바이트는 시스템이 실제로 가지고있는 것보다 훨씬 더 많은 메모리를 추가합니다.
따라서 관계는 다음과 같습니다.
- Private Bytes는 앱이 실제로 할당 한 것이지만 페이지 파일 사용량을 포함합니다.
- Working Set는 비 페이징 Private Bytes와 메모리 매핑 파일입니다.
- 가상 바이트는 작업 세트와 페이징 된 개인 바이트 및 대기 목록입니다.
여기에 또 다른 문제가 있습니다. 그냥 공유 라이브러리는 잠재적 인 오탐 (false positive)로 이어지는 응용 프로그램 모듈 내부 메모리를 할당 할 수 있습니다 앱의 전용 바이트에보고, 당신 또한 내부 메모리를 할당 끝낼 수 있습니다 응용 프로그램 공유 false로 이어지는, 모듈 제외 . 즉, 실제로 응용 프로그램이 Private Bytes에서 전혀 나타나지 않는 메모리 누수가 발생할 수 있습니다. 가능성은 없지만 가능합니다.
Private Bytes는 실행 파일이 사용하는 메모리 양의 합리적 근사치 이며 메모리 누수 가능성이있는 후보 목록을 좁히는 데 사용할 수 있습니다 . 숫자가 지속적으로 그리고 끝없이 증가하는 것을 본다면 그 과정에서 누출을 확인하고 싶을 것입니다. 그러나 이것은 누출이 있는지 여부를 증명할 수 없습니다 .
Windows에서 메모리 누수를 감지 / 수정하는 가장 효과적인 도구 중 하나는 실제로 Visual Studio입니다 (링크는 제품 페이지가 아닌 메모리 누수를 위해 VS를 사용하는 페이지로 이동합니다). Rational Purify 는 또 다른 가능성입니다. Microsoft는 이 주제에 대한보다 일반적인 모범 사례 문서도 제공 합니다. 이 이전 질문에 나열된 더 많은 도구가 있습니다 .
이로 인해 몇 가지 문제가 해결되기를 바랍니다. 메모리 누수를 추적하는 것은 디버깅에서 가장 어려운 일 중 하나입니다. 행운을 빕니다.
메모리 누수를 확인하기 위해 perfmon, 작업 관리자 또는 이와 유사한 도구를 사용하지 마십시오. 트렌드를 식별하는 데는 좋지만 그 밖의 것은 아닙니다. 절대적으로보고하는 수치는 너무 모호하고 집계되어 메모리 누수 감지와 같은 특정 작업에 유용하지 않습니다.
이 질문에 대한 이전 답변은 다양한 유형이 무엇인지에 대한 훌륭한 설명을 제공했습니다.
도구 권장 사항에 대해 질문합니다. 저는 Memory Validator를 권장합니다. 수십억 개의 메모리를 할당하는 애플리케이션을 모니터링 할 수 있습니다.
http://www.softwareverify.com/cpp/memory/index.html
면책 조항 : 저는 메모리 검사기를 설계했습니다.
perfmon 카운터의 정의는 처음부터 깨졌고 어떤 이유로 수정하기가 너무 어려워 보입니다.
Windows 메모리 관리에 대한 좋은 개요는 MSDN 의 " Mysteries of Memory Management Revealed " 비디오에서 볼 수 있습니다 . 메모리 누수를 추적하는 데 필요한 것보다 더 많은 항목 (예 : 작업 집합 관리)을 다루지 만 관련 항목에 대해 충분히 자세히 설명합니다.
perfmon 카운터 설명과 관련된 문제에 대한 힌트를 제공하기 위해 MSDN의 " Private Bytes Performance Counter-Beware! "에서 private 바이트에 대한 내부 이야기가 있습니다 .
Q : 프라이빗 바이트가 프라이빗 바이트가 아닌 경우는 언제입니까?
A : 거주하지 않을 때.
Private Bytes 카운터는 프로세스의 커밋 요금을보고합니다. 즉, 스왑 아웃 된 경우 개인 메모리의 내용을 보관하기 위해 스왑 파일에 할당 된 공간의 양입니다. 참고 : 커밋되지 않은 예약 된 상태의 가상 메모리와 혼동 될 수 있으므로 "reserved"라는 단어를 사용하지 않습니다.
MSDN의 " 성능 계획 "에서 :
3.3 개인 바이트
3.3.1 설명
개인 메모리는 다른 프로세스에서 공유 할 수없는 프로세스에 할당 된 메모리로 정의됩니다. 이 메모리는 여러 프로세스가 머신에서 실행될 때 공유 메모리보다 비쌉니다. (기존의) 관리되지 않는 dll의 개인 메모리는 일반적으로 C ++ 통계로 구성되며 dll의 전체 작업 집합의 5 % 정도입니다.
There is an interesting discussion here: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ My understanding of this thread is that freeing small allocations are not reflected in Private Bytes or Working Set.
Long story short:
if I call
p=malloc(1000);
free(p);
then the Private Bytes reflect only the allocation, not the deallocation.
if I call
p=malloc(>512k);
free(p);
then the Private Bytes correctly reflect the allocation and the deallocation.
ReferenceURL : https://stackoverflow.com/questions/1984186/what-is-private-bytes-virtual-bytes-working-set
'IT story' 카테고리의 다른 글
파이썬 정수를 이진 문자열로? (0) | 2020.12.23 |
---|---|
고정 너비를 설정하는 방법은 무엇입니까? (0) | 2020.12.23 |
.gitignore를 Git 저장소에 커밋해야합니까? (0) | 2020.12.23 |
.idea 폴더에서 무엇을 gitignore? (0) | 2020.12.23 |
Vim에서 레지스터에 텍스트를 넣지 않고 삭제할 수있는 방법이 있습니까? (0) | 2020.12.23 |