메모리가 해제된 후 힙 관리자는 메모리를 커밋 해제하지 않을 수 있습니다.

  • 아티클
  • 2023. 07. 17.
  •  

이 문서의 내용

  1. 증상
  2. 원인
  3. 해결 방법

이 문서에서는 LFH(하위 조각화 힙)를 사용하여 HeapFree해제된 메모리를 디커밋하지 않을 수 있는 문제를 설명합니다.

원래 제품 버전: Windows 8.1
원래 KB 번호: 3073576

증상

LFH 힙 관리자는 .를 사용하여 HeapFree해제된 메모리를 커밋 해제하지 않을 수 있습니다. 따라서 힙의 메모리가 해제된 경우에도 프라이빗 바이트가 증가할 수 있습니다.

원인

LFH는 메모리를 백 엔드 힙으로 반환하는 제한을 적용합니다. 애플리케이션이 많은 메모리를 할당한 다음 메모리를 해제한 다음 프로세스를 반복하는 주기에 있는 경우 LFH는 커밋된 모든 메모리를 의도적으로 반환하지 않습니다. 이는 할당 패턴이 애플리케이션이 곧 메모리를 다시 할당해야 한다는 것을 시사하기 때문에 발생합니다. 따라서 LFH는 할당 속도를 높이기 위해 애플리케이션이 해제된 부분의 일부를 캐시합니다. 애플리케이션이 패턴을 계속하면 LFH는 메모리를 계속 캐시하고 프라이빗 바이트의 증가가 발생합니다.

요점은 LFH(및 일반적으로 힙)가 메모리 블록이 해제되면 해당 메모리 블록도 커밋 해제되도록 보장할 수 없다는 것입니다.

HeapCompact 는 캐시를 플러시하는 것이 좋은 시기일 수 있음을 힙에 나타내기 위해 호출할 수 있습니다. 이렇게 하면 프라이빗 바이트의 증가를 방지할 수 있습니다. 그러나 힙 관리자는 여전히 요청을 무시할 수 있습니다.

해결 방법

프라이빗 바이트는 활성 힙 할당과 다른 것을 측정합니다. 프라이빗 바이트를 강력하게 제어해야 하는 경우 및 VirtualFree API를 사용하는 VirtualAlloc 것이 좋습니다.

Posted by gurupia
,