Thursday, June 19, 2008

Handle잡아먹는 귀신 Eclipse

가끔 Alt-Print Screen을 눌러 화면을 캡춰하는 경우, paint brush등에 붙여넣기가 안되는 경우가 있다. 메시지는 리소스가 부족합니다.
그래서 현재 사용하고 있는 어플리케이션을 보면, 이클립스가 엄청난 핸들을 차지하고 있다.
이클립스를 일주일째 계속 죽이지 않고 사용하고 있기 때문인 이유도 있지만, 저 압도적인 수치란 정말...

아. 핸들이란, windows프로그래밍을 해보면 나오는 버튼이나 inputBox등을 포함한 모든 화면상의 모든 윈도우의 key이다. 이 핸들은 계속 만들어 낼 수 있는 것이 아니고, 32비트 윈도우즈 OS에서는 이론상 최대 16비트(0부터 65535까지 65536개, 그러나 인스톨 한 뒤의 디폴트는 10000, OS에서 제한하고 있는 수치는 18000)의 수치만큼의 제한이 있다.
하나의 핸들은 88바이트를 차지한다고 한다.. 10000개면 880K바이트정도,


이러한 이유때문에 디렉토리에 1만개(디폴트 핸들 수치)가 넘는 파일이 하나의 디렉토리에 있을 경우, 윈도우 탐색기에서 아이콘을 만들어 내는 작업에 심각한 문제가 발생해 버린다. (문제가 생기는 것은 실은 그보다 훨씬 적은 수겠지만)

한 디렉토리에 파일은 더 존재 할 수 있건만... 어쩔 수 없이 나눠야 한다.
#Limitation에 대해서는 이쪽을. http://en.wikipedia.org/wiki/NTFS#Limitations
#이 수치는 파일 시스템이 FAT16인지, FAT32인지, NTFS인지에 따라서 다르다.

WinFX도 handle을 사용하고 있는 것 같은데... .Net은 왠지 일반 C어플리케이션보다 더 많이 사용하는 느낌.

CreateWindow만 하고 DestroyWindow를 안하면 Object Leak이 발생할 수 있는데.
이 핸들에 관한 한, leak을 detection, trace모두 꽤 힘든 작업이다.
http://msdn.microsoft.com/en-us/library/ms725486(VS.85).aspx

디폴트 수치는 65535보다 훨씬 작은데(그래서 메모리가 2기가여도 리소스 Limit은 그대로) 레지스트리를 수정하여 늘리는 방법도 있다. 방법은 여기. 또는 직접 수정
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit
# HKLM는 시스템에 따라 HKey_Local_Machine로 표기되도 한다.

나는 현재 10000개에서 14000개로 늘려 사용하고 있다.

윈도우즈용 JVM인지 Eclipse인지 저 핸들을 바로 바로 놓아주지 않고 Caching하나 본데 그래도 느린거 같애!

No comments: