Nexa MemKeeper 아이콘

Nexa MemKeeper

v0.7.0

트레이에 상주하는 초경량 Windows 메모리 관찰·정리 도구

다운로드 GitHub 문서 (Wiki)

모든 데스크톱 OS에서 사용할 수 있어요

설치

Windows

  1. 설치형 (권장) — GitHub Releases에서 NexaMemKeeper-<버전>-setup.exe를 받아 실행합니다. 관리자 권한이 필요 없고(사용자별 설치라 UAC 창이 뜨지 않습니다) %LOCALAPPDATA%\Programs\Nexa MemKeeper에 설치됩니다. 설치 중 자동 실행 여부를 묻고 기본 체크되어 있으며, 나중에 트레이 메뉴에서 켜고 끌 수 있습니다. 제거해도 설정은 남으므로 재설치하면 그대로 돌아옵니다.
  2. 포터블NexaMemKeeper-<버전>-portable.zip을 풀고 NexaMemKeeper.exe를 실행하면 끝입니다. 설정은 exe 옆 data\settings.ini에 생겨 폴더째 옮기면 설정도 따라옵니다(USB 휴대 가능). 폴더가 읽기 전용이면 %LOCALAPPDATA%\NexaMemKeeper로 자동 폴백합니다. 자동 실행은 꺼진 상태로 시작합니다.
  3. 브라우저가 exe 다운로드를 막는다면 같은 설치본을 감싼 NexaMemKeeper-<버전>-setup.zip을 받으세요. 자산에는 SHA256SUMS.txt가 함께 올라오므로 Get-FileHash <파일> -Algorithm SHA256으로 무결성을 대조할 수 있습니다.
  4. 관리자 권한은 선택입니다 — 일반 권한으로도 관찰·목록·정리가 동작하며, 승격하면 회수량이 약 2.6배로 늘어납니다(일반 +322MB vs 관리자 +847MB 실측). 그때그때 필요하면 트레이 메뉴의 [관리자 권한으로 재시작](UAC 1회)을 쓰고, 부팅부터 승격 상태로 띄우려면 HKCU\…\Run으로는 불가능하므로 작업 스케줄러에 "가장 높은 수준의 권한으로 실행"으로 등록해야 합니다.

두 채널 모두 같은 NexaMemKeeper.exe 하나를 담고 있어 어느 쪽을 골라도 프로그램은 동일합니다. 시스템 요구사항: Windows 10 / 11 (x64) — .NET·Visual C++ 재배포 패키지가 필요 없습니다(OS 기본 DLL 외에는 아무것도 쓰지 않습니다). 코드 서명 인증서가 아직 없어 SmartScreen 경고("알 수 없는 게시자")가 나올 수 있습니다 — "추가 정보 → 실행"으로 진행하세요. 패키지 매니저 채널 현황 (2026-08-08 확인): ⏳ 네 패키지 모두 제출을 마치고 심사 대기 중입니다 — winget SosomLab.NexaMemKeeper(설치형, PR [#413829](https://github.com/microsoft/winget-pkgs/pull/413829)) · SosomLab.NexaMemKeeper.Portable(포터블, PR [#413830](https://github.com/microsoft/winget-pkgs/pull/413830))은 08-08 제출 후 열려 있고, Chocolatey nexa-memkeeper · nexa-memkeeper.portable은 0.7.0을 올려 모더레이션 큐에 있습니다. 승인 전에는 winget install·choco install로 찾을 수 없으니 그때까지는 위의 GitHub Releases에서 직접 받으세요. 첫 등록이라 사람 검수를 거치며, 무서명 실행 파일은 바이러스 검사 오탐으로 지연되는 일이 잦습니다. 설치본의 설치·제거 왕복 실검증은 아직 진행 중입니다 — 문제가 있으면 포터블 ZIP을 쓰시면 됩니다.

무엇이 메모리를 먹고 있는지 작업 관리자와 같은 기준으로 보여주고, 필요한 순간에 회수합니다. 도구 자신이 가장 가벼워야 한다는 원칙으로 exe 0.64MB · 유휴 상주 1.34MB를 마일스톤마다 실측으로 지킵니다. (Windows 10/11)

스크린샷

메인 화면 — 작업 관리자식 분류·묶음·헤더 정렬
메인 화면 — 작업 관리자식 분류·묶음·헤더 정렬
Top 5 점유 팝업 — 프라이빗 워킹셋 기준·2초 자동 갱신
Top 5 점유 팝업 — 프라이빗 워킹셋 기준·2초 자동 갱신
실시간 검색 — 이름·PID·창 제목
실시간 검색 — 이름·PID·창 제목
설정 — 자동 정리·정리 영역·일반
설정 — 자동 정리·정리 영역·일반

주요 기능

소개

Nexa MemKeeper는 Windows 시스템 트레이에 상주하며 메모리를 지속 관찰하고, 필요 없어진 메모리를 회수해 여유분을 늘려주는 도구입니다. 관리 런타임(.NET)도 UI 프레임워크도 없이 순수 Rust + Win32 직접 호출로 만들어, 외부 DLL 없이 exe 하나로 동작합니다.

정체성은 "도구 자신의 점유 최소화"입니다. 메모리를 관리하겠다는 도구가 정작 메모리를 축내면 목적 자체가 모순이기 때문입니다. 유휴 상주 RSS ≤5MB · 단일 exe ≤3MB · 외부 DLL 0을 예산 게이트로 두고 마일스톤마다 실측하며, 넘긴 상태로는 병합하지 않습니다. 실측값은 exe 0.64MB · 유휴 상주 1.34MB입니다.

구조는 상주 셸과 온디맨드 워커로 나뉩니다. 트레이에 항상 떠 있는 것은 관찰과 트리거만 맡는 가벼운 셸이고, 프로세스 목록 창이나 실제 정리 작업은 별도 프로세스에서 수행한 뒤 종료합니다. 끝나면 OS가 그 메모리를 전량 회수하므로, 기능을 쓴 뒤에도 상주 점유가 원래 수준으로 돌아옵니다.

화면은 넷입니다. 사용률 %를 직접 그려 넣은 트레이 아이콘, 좌클릭하면 뜨는 Top 5 점유 팝업, 작업 관리자와 같은 기준으로 분류·묶어 보여주는 프로세스 목록(메인 화면), 그리고 자동 정리·정리 영역·일반을 한 창에 담은 설정입니다. 목록에서는 이름·PID·창 제목으로 실시간 검색하고, 프로세스·트리·쓰레드를 골라 종료하거나 메모리만 회수할 수 있습니다.

회수는 안전을 먼저 둡니다. 정리 영역은 여섯 가지(워킹셋 트림 · 우선순위 0 스탠바이 퍼지 · 전체 스탠바이 퍼지 · 수정 페이지 플러시 · 시스템 워킹셋 · 페이지 결합)이고, 부작용이 있는 영역은 기본 off이며 설정 화면에 그 부작용을 함께 적어 둡니다. 시스템·보호 프로세스는 목록 단계에서 하드 제외되어 오조작 자체가 불가능하고, 종료는 정상 종료 요청 후 3초를 기다린 뒤에야 강제 종료로 넘어갑니다.

이 도구는 "메모리 정리로 PC가 빨라진다"고 말하지 않습니다. 실제로 통제 실험을 돌려 확인한 결과, 주기적 정리는 성능에 도움이 되지 않았습니다 — 걷어낸 워킹셋의 절반이 14초 만에, 96%가 4분 만에 되돌아왔고(프로세스들이 그 페이지를 실제로 쓰고 있었기 때문입니다), 60초마다 정리하면 여유 메모리 표시는 688MB 늘어나는 대신 앱 기동이 4.3%, 파일 읽기가 12.6% 느려졌습니다. "여유가 있을 때만 재 본 것 아니냐"는 반문에 답하기 위해 메모리 압력을 걸어 둔 채로 다시 측정했지만 결론은 같았습니다(앱 기동 +7.0%, 파일 읽기 +14.4%). 그래서 주기 정리는 기본 off이고, 설정 화면에도 "권장하지 않음"이라고 적어 두었습니다.

대신 그 측정이 가리킨 방향으로 기능을 넓혔습니다. 실제로 문제가 되는 것은 대개 비대해진 한두 개 앱이므로, 워치리스트에 `chrome.exe:1500`처럼 적어 두면 그 프로세스만 임계를 넘을 때 조용히 트림합니다 — 다른 앱의 캐시를 건드리지 않으니 전역 정리가 치르던 비용이 없습니다. 게임·발표가 전체화면일 때는 자동 정리를 스스로 미루고(직접 누른 정리는 그대로 실행합니다), 정리할 때마다 시각·계기·회수량을 `history.csv`에 남겨 나중에 따져볼 수 있게 했습니다.

같은 이유로 알림의 회수량 표기도 손봤습니다. 흔히 쓰이는 "가용 메모리 증가분"은 트림이 밀어낸 몫을 놓쳐 실제로 일어난 일의 1/5도 설명하지 못했습니다. 지금은 앱들이 실제로 내놓은 양을 함께 보여 줍니다(예: `935MB reclaimed · apps released 5519MB`). 이 도구의 가치는 관찰(목록·Top 5·선택 종료)과 필요한 순간의 온디맨드 정리, 그리고 표적을 좁힌 워치리스트에 있습니다.

배포는 설치형과 포터블 2채널이며, 설정·데이터는 exe 옆 `data\` 폴더에만 생깁니다. PolyForm Noncommercial 1.0.0 라이선스로 개인·비상업 사용은 무료이며, 상업 사용은 별도 유료 라이선스(문의 [email protected])가 필요합니다.

릴리스 노트

v0.7.0 2026-08-08 효용성 실측이 가리킨 방향으로 — 워치리스트 표적 트림 · 전체화면 억제 · 정리 기록 · 정직한 회수량 표기.

추가

  • 워치리스트 표적 트림chrome.exe:1500처럼 적어 두면 그 프로세스만 임계를 넘을 때 조용히 트림합니다. 전역 정리가 다른 앱의 캐시까지 걷어내며 치르던 비용 없이, 실제로 비대해진 앱만 겨냥합니다. 꺼져 있으면 프로세스를 열거조차 하지 않아 유휴 비용이 0이고, 프로세스별 쿨다운과 보호 목록을 지킵니다. (현재는 설정 파일로 지정 — 목록 편집 UI는 준비 중)
  • 전체화면 중 자동 정리 보류 — 게임·발표가 전체화면이면 자동 정리를 미룹니다. Windows가 "지금 알림을 띄워도 되나"를 판단할 때 쓰는 것과 같은 기준을 씁니다. 직접 누른 정리와 핫키는 막지 않습니다 — 의도한 행동이기 때문입니다.
  • 정리 기록 — 정리할 때마다 시각·계기·회수량·Active 감소분을 history.csv에 남기고, 메인 화면 [메모리] > [정리 기록]에서 엽니다. 계기를 수동·핫키·임계값·주기·저메모리로 구분해 적으므로 나중에 해석할 수 있습니다. 최근 200줄만 유지합니다.
  • 창 위치·크기·보기 모드 기억, 열 폭 조절 — 헤더 경계를 끌어 열 폭을 바꾸고 놓는 순간 저장합니다. 창을 복원하기 전에 그 자리에 모니터가 실제로 있는지 확인하므로, 외부 모니터를 뽑아도 창이 화면 밖으로 사라지지 않습니다.

개선

  • 알림에 앱들이 실제로 내놓은 양을 병기 — 기존의 가용 메모리 증가분 표기는 트림이 밀어낸 몫을 놓쳐 실제의 1/5도 설명하지 못했습니다. 이제 935MB reclaimed · apps released 5519MB처럼 두 숫자를 함께 보여 줍니다. 두 값이 비슷하면 숫자를 늘어놓지 않고, 측정에 실패하면 추정치로 채우지 않습니다.
  • 설정 창의 주기 정리 항목에 비권장 근거 표시 — "권장하지 않음 — 앱이 14초 안에 되찾아갑니다." 옵션을 없애지는 않았습니다. 이유를 알고 고르는 편이 낫기 때문입니다.

측정

  • 고압력 구간 재측정 — "여유가 넉넉할 때만 재 본 것 아니냐"는 반문에 답하려고 메모리 압력을 걸어 둔 채 다시 쟀습니다. 결론은 같았습니다 — 앱 기동 341 → 365ms(+7.0%), 파일 읽기 40.3 → 46.1ms(+14.4%). 회수 자체는 압력 구간에서도 컸지만(Active −5.8GB) 속도로 이어지지 않았습니다.
  • 첫 측정은 압력이 1~2분 만에 풀려 폐기했습니다(점유 프로세스가 각 청크의 첫 바이트만 만졌습니다). 접촉 방식을 고쳐 재측정한 값만 남겼고, 수백 MB 규모의 진짜 스래싱은 이 장치로 유지할 수 없어 미검증으로 적어 두었습니다.
  • 바꿀 기본값은 없었습니다 — 주기 정리 off · 공격적 영역 off · 임계값 90%가 이미 이 결론과 일치합니다.

배포

  • Chocolatey 2패키지 등록nexa-memkeeper(설치형) · nexa-memkeeper.portable 0.7.0을 올려 모더레이션 대기 중입니다.
  • winget 최초 PR 2건 제출 — [#413829](https://github.com/microsoft/winget-pkgs/pull/413829)(설치형) · [#413830](https://github.com/microsoft/winget-pkgs/pull/413830)(포터블). 두 채널 모두 승인 전이라 아직 한 줄 설치는 열리지 않았습니다.
  • 실측: exe 0.64MB · 유휴 상주 RSS 1.34MB · 외부 DLL 0 · 테스트 57건 통과.
v0.6.2 2026-08-07 릴리스 자산 4종 자동 첨부 정정 + winget 포터블 패키지 준비.

수정

  • 설치본 ZIP이 릴리스에 빠져 있던 문제 — 포장 스크립트는 만들었지만 워크플로의 첨부 목록에 그 줄이 없었습니다(0.6.1). 이제 설치본 exe · 설치본 ZIP · 포터블 ZIP · SHA256SUMS.txt 4종 전부가 자동으로 첨부됩니다.

배포

  • winget 2패키지 체계 완비SosomLab.NexaMemKeeper(설치형·머신 범위) / SosomLab.NexaMemKeeper.Portable(포터블·사용자 범위, nexamemkeeper 별칭). Chocolatey도 같은 구도로 2패키지입니다. 하나의 winget 패키지에 설치형과 포터블을 함께 담을 수 없어 나눴습니다.
  • 앱 동작 변경은 없습니다 — 0.6.0 이후 0.6.1·0.6.2는 포장 파이프라인 검증과 그 정정이 목적이었습니다.
v0.6.0 2026-08-07 첫 공개 릴리스 — 트레이 상주 셸부터 프로세스 목록·설정·배포 2채널까지.

추가

  • 트레이 상주 셸 — 사용률 %를 그려 넣은 아이콘(색 단계 80/90%), 사용량·마지막 정리를 담은 툴팁, 우클릭 메뉴(지금 정리·목록 보기·설정·자동 실행·관리자 권한으로 재시작·종료). 탐색기가 재시작되어도 아이콘이 되살아납니다.
  • Top 5 점유 팝업 — 트레이 좌클릭. 프라이빗 워킹셋 기준 상위 5개를 2초마다 갱신하고, 항목 우클릭으로 트림·종료합니다. 열거는 NtQuerySystemInformation 한 번으로 끝납니다(500개 기준 7.5ms).
  • 프로세스 목록(메인 화면) — 작업 관리자와 같은 분류(앱/백그라운드/Windows)와 묶음, 표시 이름(Sublime Text), 보기 3종(묶음·트리·평면), 헤더 클릭 정렬, 쓰레드 표시 옵션, 프로세스·트리·쓰레드 종료.
  • 실시간 검색 — 이름·PID·창 제목으로 즉시 걸러내며 구조를 유지합니다(창 제목이 걸리면 앱 행 + 그 창, 트리에서는 조상까지). 접어 둔 묶음도 검색 중에는 펼쳐 그리고, 지우면 원래 접힘으로 돌아옵니다.
  • 정리 엔진 — 영역 ①~⑥ 개별 선택. 워킹셋 트림 · 우선순위 0 스탠바이 퍼지(기본 on) / 전체 스탠바이 퍼지 · 수정 페이지 플러시 · 시스템 워킹셋 · 페이지 결합(기본 off, 부작용 표기).
  • 자동 정리 — 사용률 임계값(기본 90%) · Windows 저메모리 알림 · 주기 정리(기본 off)와 쿨다운(기본 5분). 정리 결과는 알림으로 알리고 6초 뒤 저절로 사라집니다.
  • 설정 창 · 전역 핫키 · 다국어 — 자동 정리/정리 영역/일반 세 묶음을 작은 창 하나에. 어디서나 "지금 정리"를 실행하는 전역 핫키를 직접 눌러 지정하고, UI 언어는 영어(기본)·한국어·OS 따름 중에 고릅니다.
  • 배포 2채널 — 설치형(Inno Setup, 사용자별 설치·프로그램 목록 등록·자동 실행 질문 기본 체크)과 포터블 ZIP. 두 채널이 같은 exe 하나를 담고, 설정은 어느 쪽이든 exe 옆 data\settings.ini에 저장됩니다.
  • 사용자 위키 7쪽 공개 — 기능·정리 영역·설정·설치·구조·문제 해결 + 스크린샷. 상단 "문서 (Wiki)" 버튼에서 볼 수 있습니다.

실측

  • 예산 게이트 전 항목 통과 — exe 0.64MB(≤3MB) · 유휴 상주 RSS 1.30MB(≤5MB) · 외부 DLL 0(OS 인박스만) · 포터블 ZIP 356KB · 테스트 55건 통과.
  • 기능 창을 닫으면 상주 점유가 원래대로 복귀합니다 — 팝업을 열면 6.94MB까지 올랐다가 닫으면 다시 유휴 수준으로 돌아옵니다. 무거운 작업은 별도 프로세스가 맡아 종료 시 OS가 전량 회수하는 구조 덕분입니다.
  • 정리 1회 실측 — 관리자 권한에서 466개 프로세스를 트림해 +847MB, 일반 권한에서는 115개 +322MB. 관리자 권한은 선택이며, 승격하면 회수량이 약 2.6배가 됩니다.

알림

  • 코드 서명 인증서가 아직 없습니다 — 직접 내려받은 파일에 SmartScreen 경고가 나올 수 있습니다("추가 정보 → 실행"). 브라우저가 exe를 막으면 -setup.zip을 쓰세요.
  • winget·Chocolatey 등록은 준비 단계입니다 — 매니페스트는 저장소에 있으나 커뮤니티 심사를 거치기 전이라 아직 한 줄 설치가 열리지 않았습니다.