문제 해결 ERROR_NOT_ENOUGH_MEMORY
-
12-09-2019 - |
문제
우리의 응용 프로그램은 하나의 특정 사용자의 컴퓨터에서 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-PROBLEMS는 무료를 사용하여 모니터링 할 수 있습니다 gdiview 공익사업. 사용자가 설치 프로그램없이 시작할 수있는 단일 파일입니다.
또한 설치하십시오 ProcessExplorer 관련 기계에서.
컴퓨터에 액세스 할 수없는 경우 사용자에게 응용 프로그램에서 모니터링하는 상태의 스크린 샷을 작성하도록 요청하십시오. 매우 유사합니다. 이것은 당신에게 약간의 힌트를 줄 것입니다.
더 일반적인 원인이 오류가 나열된 원인은 가상 메모리 공간의 조각화입니다. 이 상황은 총 자유 메모리가 상당히 합리적이지만 여유 공간이 현재 할당되고있는 다양한 비트의 가상 메모리 공간으로 조각화됩니다. 따라서 총 자유가 충분한 상태에도 불구하고 메모리 요청이 단일 연속 블록으로 만족할 수 없을 때 메모리 오류를 얻을 수 있습니다.
내 대답은 조금 늦을 수 있지만 같은 문제에 대한 늦은 경험에서 모든 테스트를 수행하고 단계별로 진행하고 DC를 만들고, 사용하고, 사용합니다. DIBSection
대신에 CompatibleBitmap
, 누출 GDI/메모리 도구 등 사용
결국 (lol) 나는 그것을 발견했다 :
이 두 호출의 우선 순위를 전환 한 다음 전체 문제가 수정되었습니다.
DeleteDC(hdc); //do it first (always before deleting objects)
DeleteObject(obj);