PE Notes · CA/OS
메모리 누수
해제를 잊은 힙이 천천히 차는 메모리 누수를 다섯 패턴으로 가르고, 언어별 관리와 탐지·예방을 정리합니다.
잘못된 주소는 바로 죽이고, 잊지 않은 해제는 며칠을 버팁니다. 는 동적 할당을 쓴 뒤 돌려주지 않아 힙이 조금씩 커지는 현상입니다. 크래시가 없어 장기 서버와 재시작 없는 임베디드에서 더 위험합니다. 끝이 이면 커널이 프로세스를 고릅니다.
다섯 패턴
가장 단순한 구멍은 할당 뒤 반환을 빼먹는 일입니다. 성공 경로는 닫아 두고 오류 분기만 열어 두는 경우도 같습니다. 객체 둘이 서로를 붙들면 도 거두지 못합니다. 캐시에 넣기만 하고 쫓아내지 않으면 맵이 무한히 큽니다. 이벤트 핸들러를 붙인 채 빼지 않으면 콜백이 객체를 붙잡습니다.
| 패턴 | 한 줄 |
|---|---|
| 단순 미해제 | 반환 없이 함수를 나감 |
| 예외 경로 | 오류 return 앞에 해제가 없음 |
| 순환 참조 | 강한 참조가 고리를 만듦 |
| 캐시 팽창 | 축출 정책이 없음 |
| 핸들러 잔류 | 구독만 있고 해지는 없음 |
진행은 사용량 상승 → 스왑 → 응답 저하 → OOM 종료입니다. 가상 메모리 노트와 맞닿고, 세그폴트처럼 한 명령에서 끝나지 않습니다.
언어와 탐지
C·C++는 개발자가 쌍을 맞춥니다. 위험은 높습니다. 자바·코틀린·파이썬·Go는 수집기가 대부분을 치우나, 고리와 전역 캐시는 남습니다. 러스트는 소유권이 컴파일 때 수명을 닫아 누수 자리가 크게 줄어듭니다.
같은 런타임 검사기와 주소 살균이 할당 지점을 가리킵니다. 힙 프로파일은 증가 곡선을 보고, 가상 머신 힙 덤프는 참조 그래프를 펼칩니다. 관측은 시계열로 상한을 감시합니다. 정적 분석은 아직 달리지 않은 경로를 줍습니다.
예방은 소멸자에서 닫는 , 수명을 객체에 맡기는 , 고리를 끊는 약한 참조, 미리 깎아 재쓰는 풀입니다. 답안은 정의, 다섯 패턴, OOM 길, 언어 표, RAII를 한 장에 닫습니다.