고용량 메모리를 제대로 활용하고 계십니까? :: 2007/11/10 17:19


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

사용자 삽입 이미지

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

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

사용자 삽입 이미지

그런데 제가 이제껏 알기론 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가 되겠죠. 바꾸고 저장하고 재부팅하면 됩니다.

스폰서
글타래

  • 2주간 인기 글
  • 2주간 인기글이 없습니다.
Trackback Address :: http://jiniya.net/tt/trackback/644
  • Gravatar Image.
    Maro | 2007/11/10 17:31 | PERMALINK | EDIT/DEL | REPLY

    아.. 제 컴퓨터도 3MB로 설정되어있네요 :)
    저도 살짝 8MB로 바꿨습니다.
    오늘도 좋은것 배워가네요 ~_~)/

    • Gravatar Image.
      codewiz | 2007/11/10 17:56 | PERMALINK | EDIT/DEL

      OS 버전에 따라 차이가 있는것 같긴 한데, XP는 그냥 설치하면 다 기본으로 3MB로 잡히나 봐요. ^^;;

  • Gravatar Image.
    window31 | 2007/11/11 23:53 | PERMALINK | EDIT/DEL | REPLY

    멋져요~ 저라면 무한 할당을 시켜보고 거기서 포기했을 텐데... GDI까지 생각하리라고는...
    테스크매니저의 GDI 객체 옵션은 처음 봅니다 좋은정보 감사 :)

    • Gravatar Image.
      codewiz | 2007/11/12 12:41 | PERMALINK | EDIT/DEL

      한 세 번 봤을 때 까지는 참았는데, 자주 뜨니깐 정말 못 참겠더라고요. 구글님의 도움이 컸죠. ^^;;

  • Gravatar Image.
    thinker0 | 2007/11/12 19:28 | PERMALINK | EDIT/DEL | REPLY

    Windows 2003 R2은 기본적으로 SharedSection=1024,20480,768 이렇게 되네요 ^^;

    • Gravatar Image.
      codewiz | 2007/11/13 12:41 | PERMALINK | EDIT/DEL

      그렇군요.
      서버 운영체제라 그런지 엄청 많이 잡혀있네요 ^^;;

  • Gravatar Image.
    ┕ⓒⓞⓞⓛ┙ | 2007/11/20 14:24 | PERMALINK | EDIT/DEL | REPLY

    좋은 정보 감사합니다.
    만약 비스타에 4GB면 몇 메가로 해주는 것이 좋을까요?

    • Gravatar Image.
      codewiz | 2007/11/20 15:15 | PERMALINK | EDIT/DEL

      정해진 답이 있는 것은 아닙니다. 데스크탑 메모리 라는게 윈도우 객체, 훅 객체 등을 저장되는데 사용되는 메모리이기 때문에 평소 얼마나 많은 창을 띄워놓고 사용하는지에 따라 다르답니다.

      평소에 컴퓨터를 사용하면서 한번이라도 메모리 부족으로 프로그램이 실행되지 않은 적이 있다면 그 때 늘려주시면 됩니다. 자신이 지금 어느 정도의 윈도우를 생성하는지 알고 싶으시다면 탐색기를 계속 띄워보세요. 윈도키 + E를 누르면 계속 실행됩니다. 어느 순간 아마 탐색기가 실행이 되지 않는 순간이 있을 겁니다. 그 만큼이 지금 생성할 수 있는 최대 창의 개수 입니다. 물론 프로그램에 따라 다르지만 대략 그 정도로 볼 수 있습니다. 그 창의 개수가 작다고 생각하신다면 위에 나온 레지스트리 값을 조절해 주시면 됩니다. 두 배로 늘린다면 탐색기 창을 두 배 정도 더 만들 수 있다는 것을 의미합니다. 평소 자신이 띄워놓고 사용하는 창의 개수에 맞춰서 정하는 것이 바람직합니다.

  • Gravatar Image.
    보브 | 2009/11/24 02:37 | PERMALINK | EDIT/DEL | REPLY

    비스타64비트 사용하는유저입니당.
    램은 8기가인데 프로그램이 실행이안돼네요 17개인가 그이상돼게 할려고
    별의별 검색을 다해봐도 답이없네요 .. ㅜㅜ
    힘좀 주시면 감사하겠어요

  • Gravatar Image.
    gon | 2011/10/04 10:54 | PERMALINK | EDIT/DEL | REPLY

    안녕하세요. 님 블로그에서 소중한 정보 잘 보았습니다. 그런데 제가 질문 하나 해도 될까요?
    저는 이제 막 시작한 초짜 사원이구요. 제가 지금 근무하고 있는 곳과 협력 업체인 모기업에서 사용하는 서버컴의 운영체제가 윈도우즈 서버 2003 Enterpise Edition 입니다.
    그런데 응용프로그램을 이용해서 데이터 전송을 하는 도중 자꾸 아웃오브메모리가 발생해서, 데이터가 누락되는 상황이 나오는 것 같거든요. 그래서 본문의 정보대로 서버컴의 힙메모리를 알아보니, 서버컴에서 고작 3mb가 산정되어있더라고요(...)
    마음같아선 바로 레지 정보를 변경하고 싶었지만, 아무래도 우리 회사컴이 아니다보니, 시스템 자체를 바꾸기 보다는 개발하고 있는 응용프로그램에서 어떻게든 해결을 보고 싶은 마음이 있거든요. 개발 언어는 C#을 이용하고 있습니다.
    즉 응용프로그램에서 운영체제에서 할당된 힙메모리를 동적으로 변경하여 돌릴 수 있는 방법이 있을까요?

    • Gravatar Image.
      codewiz | 2011/10/05 10:50 | PERMALINK | EDIT/DEL

      해당 시점에 데이터를 전송하고 있는 응용 프로그램이 차지하고 있는 메모리를 혹시 확인해 보셨나요? 이 글에서 언급한 내용은 데스크탑 힙에 관한 내용으로 해당 내용은 윈도우에서 창을 생성하는 과정에만 관여합니다. 즉, 해당 응용 프로그램이 데이터를 전송하면서 지속적으로 창을 생성하기만하고 파괴하지 않는다면 이 글의 내용과는 크게 관련이 없을 것 같네요. 메모리 릭이 없는지 체크를 해보시는게 좋을 것 같네요.

Name
Password
Homepage
Secret
< PREV | 1| ... 95|96|97|98|99|100|101|102|103| ... 604| NEXT >