본문 바로가기

프로그래밍/Delphi

GDI객체 및 기본 윈도우 메모리 힙 할당문제

델파이로 이미지를 많이 다루는 프로그램을 하다보면 잘 굴러가다가 가끔 메모리 부족 또는 Dib Handle 오류 또는 OutOfResource등 오류가 발생하는 군요 물리적 메모리가 2G이상 이고 남아있는 메모리 용량이 상당한데도 매번 이런 오류가 뜨는데 해결 방법을 찾다 보니 다음과 같은 좋은 해법이 있군요

참조 : http://www.jiniya.net/tt/644

요약하자면 GDI객체는 메모리가 허용하는 한도 내에서 생성이 되는데
윈도우 메모리 힙이 기본적으로 3M정도 기본으로 설정되어 있어서 이 힙 사이즈를 늘려주면
GDI 객체 생성에 여유가 생긴다는 겁니다.

설정 방법은
 레지스트리 에디터에서 "HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> Control -> Session Manager -> SubSystems"를 엽니다. 거기서 Windows 항목을 선택합니다. 그럼 아래와 같은 긴 문자열을 볼 수 있을 겁니다.

%SystemRoot%\system32\csrss.exe
ObjectDirectory=\Windows
SharedSection=1024,3072,512
Windows=On
SubSystemType=Windows
ServerDll=basesrv,1
ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=winsrv:ConServerDllInitialization,2
ProfileControl=Off
MaxRequestThreads=16

위 부분에서 SharedSection=1024,3072,512 부분이 핵심입니다. 여기서 두 번째 항목인 3072가 데스크탑 힙으로 할당된 메모리의 크기입니다. 단위가 킬로바이트이기 때문에 계산하면 3메가가 됩니다. 저 숫자를 올려 주시면 됩니다. 8192로 지정하면 8MB가 되겠죠. 바꾸고 저장하고 재부팅(사이즈는 더 크게 해도 되는데... 기본으로 3M로 해 놨다는 얘기는 대부분 충분하다는 얘기인데 많으면 다른쪽에 영향을 주긴 한다는 간접적인 추정)

아 서버운영체제(예 Windows2003은 20480으로 되어 있네요,,, 서버라서 그런가)

이것으로 GDI문제 완전 해결 되기를....