메모리가 해제된 후 힙 관리자는 메모리를 커밋 해제하지 않을 수 있습니다.
- 아티클
- 2023. 07. 17.
이 문서의 내용
이 문서에서는 LFH(하위 조각화 힙)를 사용하여 HeapFree해제된 메모리를 디커밋하지 않을 수 있는 문제를 설명합니다.
원래 제품 버전: Windows 8.1
원래 KB 번호: 3073576
증상
LFH 힙 관리자는 .를 사용하여 HeapFree해제된 메모리를 커밋 해제하지 않을 수 있습니다. 따라서 힙의 메모리가 해제된 경우에도 프라이빗 바이트가 증가할 수 있습니다.
원인
LFH는 메모리를 백 엔드 힙으로 반환하는 제한을 적용합니다. 애플리케이션이 많은 메모리를 할당한 다음 메모리를 해제한 다음 프로세스를 반복하는 주기에 있는 경우 LFH는 커밋된 모든 메모리를 의도적으로 반환하지 않습니다. 이는 할당 패턴이 애플리케이션이 곧 메모리를 다시 할당해야 한다는 것을 시사하기 때문에 발생합니다. 따라서 LFH는 할당 속도를 높이기 위해 애플리케이션이 해제된 부분의 일부를 캐시합니다. 애플리케이션이 패턴을 계속하면 LFH는 메모리를 계속 캐시하고 프라이빗 바이트의 증가가 발생합니다.
요점은 LFH(및 일반적으로 힙)가 메모리 블록이 해제되면 해당 메모리 블록도 커밋 해제되도록 보장할 수 없다는 것입니다.
HeapCompact 는 캐시를 플러시하는 것이 좋은 시기일 수 있음을 힙에 나타내기 위해 호출할 수 있습니다. 이렇게 하면 프라이빗 바이트의 증가를 방지할 수 있습니다. 그러나 힙 관리자는 여전히 요청을 무시할 수 있습니다.
해결 방법
프라이빗 바이트는 활성 힙 할당과 다른 것을 측정합니다. 프라이빗 바이트를 강력하게 제어해야 하는 경우 및 VirtualFree API를 사용하는 VirtualAlloc 것이 좋습니다.
'[Microsoft]' 카테고리의 다른 글
DST를 포함하는 날짜 및 시간 처리 (1) | 2023.11.03 |
---|---|
EvtFormatMessage를 사용하여 이벤트에 대한 형식이 지정된 문자열 가져오기 (0) | 2023.11.03 |
GetTickCount는 약 776일 후에 0으로 다시 설정됩니다. (0) | 2023.11.03 |
파일이 FILE_SHARE_WRITE 사용하여 잠겨 있는 경우 파일 복사 작업이 파일 콘텐츠를 삭제합니다. (0) | 2023.11.03 |
CreateProcess는 lpEnvironment 매개 변수의 환경 블록에서 중복된 변수를 제거하지 않습니다. (0) | 2023.11.03 |