Sandcorp샌드코프 · 웹·AI 제품 개발

새 프로젝트 받는 중 · 갱신 2026.11sandcorp.co.krGitHub

← 팁

메모리

Windows 핸들 수가 계속 늘면 어느 프로세스, svchost라면 그 안의 어느 서비스인지까지 찾는다

며칠 켜 두면 느려지고 커널 CPU가 오르면 핸들 누수를 의심합니다. 프로세스별 HandleCount로 범인을 찾고, svchost면 PID로 서비스 이름을 알아내 그것만 재시작합니다.

재부팅 직후에는 멀쩡하던 Windows가 며칠 켜 두면 눈에 띄게 굼떠집니다. 작업 관리자에서 사용자 프로그램의 CPU는 낮은데, 성능 탭의 커널 시간이 평소보다 높게 붙어 있습니다. 메모리가 크게 부족하지도 않습니다.

이럴 때 의심할 것이 핸들 누수입니다. 핸들은 프로세스가 파일·레지스트리 키·이벤트·스레드 같은 커널 객체를 쓸 때 받는 번호표입니다. 다 쓰면 돌려줘야(닫아야) 하는데, 프로그램이 돌려주지 않으면 커널 객체가 계속 쌓입니다. 쌓인 객체는 커널 메모리를 차지하고, 커널이 그 목록을 다루는 비용도 늘어납니다. 정상 프로그램은 수백~수천 개 수준에서 오르내리는데, 새는 프로그램은 수십만 개까지 올라갑니다. 한 번 재 보고 끝내지 말고 시간을 두고 두 번 이상 재서 계속 느는 것을 찾아야 합니다.

먼저 프로세스별 핸들 수를 봅니다. 많은 것 위주로 적어 두고, 몇 시간 뒤 다시 재서 늘어난 양을 비교합니다.

Get-Process | Sort-Object HandleCount -Descending |
  Select-Object -First 10 Name, Id, HandleCount

위에 svchost가 있으면 한 단계 더 들어가야 합니다. svchost는 여러 Windows 서비스를 담는 그릇이라, 이름만으로는 무엇이 새는지 알 수 없습니다. PID로 그 안의 서비스를 확인합니다.

Get-CimInstance Win32_Service -Filter "ProcessId=1234" |
  Select-Object Name, DisplayName, State

범인을 찾으면 그 앱이나 서비스만 재시작합니다(Restart-Service <이름>, 관리자 권한). 재부팅까지 할 필요가 없습니다. 이때 앱 창만 닫았다 여는 것으로는 부족할 수 있습니다. 창이 닫혀도 트레이에 남은 프로세스나 그 앱이 쓰는 서비스 쪽 핸들은 그대로이므로, 프로세스가 실제로 끝났는지 다시 재서 확인합니다. 재시작 뒤 핸들 수와 커널 CPU가 함께 내려가면 원인을 맞게 찾은 것이고, 같은 프로그램이 다시 늘기 시작하면 업데이트나 제보로 이어 갑니다.

문의 →