C#: 장시간 실행 후 메모리 사용량이 계속 증가: 원인과 해결 순서
C#: 장시간 실행 후 메모리 사용량이 계속 증가의 대표 원인을 구분하고 안전하게 재현·수정·검증하는 순서를 정리합니다.
짧은 요약
C#: 장시간 실행 후 메모리 사용량이 계속 증가은(는) 설정을 무작정 초기화하기보다 실행 환경과 오류 경계를 먼저 확인해야 안전하게 해결할 수 있습니다. 프로파일러로 보유 참조를 찾고 자원 해제와 캐시 상한을 추가하는 순서로 접근합니다.
증상과 환경
- 대상: C#
- 운영체제: Cross-platform
- 난이도: 어려움
C#: 장시간 실행 후 메모리 사용량이 계속 증가. 먼저 오류 전문, 실행 계정, 도구 버전, 발생 시각을 함께 기록합니다.
원인
이벤트 구독, 전역 컬렉션, 캐시, 스트림처럼 수명이 긴 객체가 요청 데이터를 계속 참조하면 가비지 컬렉션 후에도 메모리가 줄지 않습니다.
재현 예시
동일 작업을 일정 횟수 반복하면서 처리량과 힙 사용량을 함께 기록하고, 유휴 시간 뒤에도 기준선이 상승하는지 봅니다.
단계별 해결법
1. 운영 데이터 대신 재현 가능한 부하에서 기준 메모리를 측정합니다.
2. 힙 스냅샷이나 런타임 진단 도구로 증가하는 객체 유형을 찾습니다.
3. 참조를 보유한 캐시·리스너·고루틴·스트림의 종료 경로를 수정합니다.
4. 수정 전후를 동일한 부하와 시간으로 비교합니다.
코드·명령 예문
dotnet-counters monitor --process-id <PID> System.Runtime명령의 <command>, <path>, <domain>, <PID>, <package>는 실제 값으로 바꿉니다. 변경 명령을 실행하기 전에 위 진단 결과부터 확인하세요.
확인법
워밍업 이후 여러 구간의 힙 기준선이 안정되고 처리량과 오류율이 악화되지 않는지 확인합니다.
주의사항
RSS 증가만으로 누수를 단정하지 마세요. 런타임 힙, 네이티브 메모리, 메모리 할당자 특성을 구분해야 합니다.
관련 이슈
- c#
- memory
- leak
- 환경변수와 실행 계정 차이
- 캐시 또는 이전 실행 결과의 영향