문제

우리의 응용 프로그램은 하나의 특정 사용자의 컴퓨터에서 ERROR_NOT_ENOUGH_MEMORY ( "이 명령을 처리하기에 충분한 스토리지를 사용할 수 없습니다").

오류는 우리가 사용하고있는 Delphi VCL 프레임 워크 내에서 어딘가에 올라가고 있으므로 어떤 Windows API 기능이 책임이 있는지 확실하지 않습니다.

메모리가 문제입니까? 전화 GlobalMemoryStatus 다음 정보를 제공합니다.

  • DWTOTALPHYS -1063150000 (~ 1GB)
  • Dwavailphys -26735000 (~ 27MB)
  • dwavailpage -1489000000 (~ 1.4 GB)

페이징 파일에서 공간이 너무 많을 때 Windows가 사용 가능한 물리적 메모리가 너무 낮아지게하는 것은 이상하게 보이지만 Windows의 가상 메모리 관리에 대해 충분히 알지 못합니다. 그게?

메모리가 아니라면 어떤 리소스 제한이 발생합니까? 내가 온라인으로 읽은 내용에서 ERROR_NOT_ENOUGH_MEMORY 응용 프로그램이 여러 한계 (GDI 객체, 사용자 객체, 핸들 등)를 누르면 반드시 메모리가 아니라는 결과 일 수 있습니다. Windows가 시행하는 한계의 포괄적 인 목록이 있습니까? 어떤 한계가 발생했는지 알아낼 수있는 방법이 있습니까? Google을 시도했지만 체계적인 개요를 찾을 수 없었습니다.

도움이 되었습니까?

해결책 3

이 경우 범인은이었다 CreateCompatibleBitMap. 분명히 Windows는 장치 의존 비트 맵에 사용할 수있는 메모리에서 상당히 엄격한 시스템 전반의 한계를 시행 할 수 있습니다 (예 : 참조, 이 메일 링리스트 토론), 시스템에 많은 메모리와 많은 GDI 리소스가있는 경우에도. (이 시스템 전체의 한계는 Windows가 비디오 카드의 메모리에 장치 의존 비트 맵을 할당 할 수 있기 때문에 분명히 나타납니다.)

솔루션은 단순히 장치 독립 비트 맵 (DIB)을 대신 사용하는 것입니다 (이는 성능이 좋지는 않지만). 이 KB 기사 장치의 최적 DIB 형식을 선택하는 방법을 설명합니다.

자원 한도에 대한 다른 후보자 (다른 사람의 답변과 내 연구에서) :

  • GDI 리소스 (이 답변에서) - 쉽게 확인 gdiview
  • 가상 메모리 조각화 (이 답변에서)
  • 데스크탑 힙 - 참조 여기 또는 여기

다른 팁

모든 가능성을 확인하십시오.

GDI-PROBLEMS는 무료를 사용하여 모니터링 할 수 있습니다 gdiview 공익사업. 사용자가 설치 프로그램없이 시작할 수있는 단일 파일입니다.

또한 설치하십시오 ProcessExplorer 관련 기계에서.

컴퓨터에 액세스 할 수없는 경우 사용자에게 응용 프로그램에서 모니터링하는 상태의 스크린 샷을 작성하도록 요청하십시오. 매우 유사합니다. 이것은 당신에게 약간의 힌트를 줄 것입니다.

더 일반적인 원인이 오류가 나열된 원인은 가상 메모리 공간의 조각화입니다. 이 상황은 총 자유 메모리가 상당히 합리적이지만 여유 공간이 현재 할당되고있는 다양한 비트의 가상 메모리 공간으로 조각화됩니다. 따라서 총 자유가 충분한 상태에도 불구하고 메모리 요청이 단일 연속 블록으로 만족할 수 없을 때 메모리 오류를 얻을 수 있습니다.

내 대답은 조금 늦을 수 있지만 같은 문제에 대한 늦은 경험에서 모든 테스트를 수행하고 단계별로 진행하고 DC를 만들고, 사용하고, 사용합니다. DIBSection 대신에 CompatibleBitmap, 누출 GDI/메모리 도구 등 사용

결국 (lol) 나는 그것을 발견했다 :

이 두 호출의 우선 순위를 전환 한 다음 전체 문제가 수정되었습니다.

DeleteDC(hdc);       //do it first (always before deleting objects)
DeleteObject(obj);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top