고용량 메모리를 제대로 활용하고 계십니까?

@codemaru · November 10, 2007 · 6 min read

전 작업 표시줄을 세 줄로 사용합니다. 노트북이라 보통은 자동 숨김 옵션을 켜두고 사용하죠. 그래서 평소 때 작업할 때는 아래와 같은 화면이 연출되곤 합니다. 물론 아래 화면은 보여주기 위해서 무작위로 탐색기와 익스플로러를 많이 띄운 것입니다. 보통 때는 각기 다른 창들로 저만큼의 공간을 차지 한다는 것이죠.

                       md 0

얼마전에 우연찮은 기회에 노트북 메모리를 업그레이드 할 수 있었습니다. 원래 1GB였는데, 업그레이드해서 2.5GB가 되었죠. 업그레이드하면서 스왑이 좀 줄겠군 이라고 생각했습니다. 역시 생각대로 덜 버벅대더군요. 그런데 웃긴게 예전에는 한 번도 보지 못했던 메모리 부족으로 프로그램을 실행할 수 없다는 메시지를 몇 번 보게 되었습니다. 어제 오늘 한 5~6회 만난것 같네요. 처음엔 바이러슨가 하고 생각하다가, 창을 닫으면 다시 실행되길래 그건 아닌가보다고 생각을 했습니다. 그리곤 작업관리자를 띄워서 확인해 봅니다. 늘 상 할당된 메모리가 1.2 ~ 1.4GB 사이더군요. 이렇게 메모리가 많이 남았는데 왠 메모리가 부족하다는 말이 나올까 궁금했습니다.

프로그램을 한 번 만들어봤습니다. 과연 이 녀석이 2GB를 쓰긴 할까 하는 생각으로 말이죠. 할당만 마구마구 하는 프로그램을 만드니 금새 2GB까지 사용하더군요. 그 상태에서 다른 프로그램들을 띄워 보았습니다. 메모리가 없는데도 잘 뜹니다. 당연하겠죠. 스왑이 있으니까요. 그럼 제가 아까 본 메모리 부족 오류는 무엇일까요? 그 다음 추측은 GDI 객체 였습니다. 창을 많이 띄우면 GDI 객체도 늘어나고 그것 때문에 창이 생성이 되지 않을 것이라는 추측을 한 것이죠. 그래서 작업 표시줄을 띄워놓고 좀 테스트를 해봤습니다. 그랬더니 정말 GDI 객체랑 연관이 있어 보였습니다.

                       md 1

그런데 제가 이제껏 알기론 NT 계열 운영체제에서는 GDI 객체의 경우 메모리가 허용하는 한도 내에서 생성이 되는 걸로 알고 있었습니다. 그게 상식에 부합하잖아요. 앞서 만들었던 프로그램을 수정해서 GDI 객체를 무작위로 생성하도록 만들었습니다. 10000개 가까이 되니 더 이상 생성을 못하더군요. 이상했습니다. 메모리는 넘쳐나는 상황이었거든요. 구글에 물어보니 역쉬나 레이몬드 첸 아저씨가 친절하게 답변을 해주시는 군요.

http://blogs.msdn.com/oldnewthing/archive/2007/07/18/3926581.aspx

하지만 이건 앞서 생각했던 근본에 대한 답변은 아니죠. 프로세스 당 제한이니까요. GDI 객체를 생성하던 놈이 9000개 정도 생성한 다음 다른 프로그램을 실행하면 잘 됩니다. 그렇다면 도대체 그 메모리 에러는 왜 난 것일까요? 답은 아래 페이지에 나와 있습니다. 2.5GB의 메모리를 장착하고도 데스크탑 힙이 3MB로 한정되 있어서 메모리가 부족하다는 오류를 만난 것이었습니다. 8MB로 늘려 주었습니다. 이제는 더 이상 메모리가 부족해서 창을 생성할 수 없다는 오류 메시지를 만나지 않겠죠. ㅋㅋㅋ

http://www.techarp.com/showarticle.aspx?artno=238
http://weblogs.asp.net/kdente/archive/2004/06/04/148145.aspx
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q126962
http://monac.egloos.com/1396478
http://www.blogcastrepository.com/blogs/mattbro/archive/2006/08/21/2013.aspx
http://support.microsoft.com/default.aspx?scid=kb;EN-US;184802
http://www.techarp.com/showarticle.aspx?artno=238&pgno=1
http://msdn2.microsoft.com/en-us/library/ms724291.aspx

데스크탑 힙을 늘리는 방법은 간단합니다. 레지스트리 에디터에서 "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가 되겠죠. 바꾸고 저장하고 재부팅하면 됩니다.

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중