메모리 누수

IT 위키
Memory Leak; 메모리 누출
프로그램이 할당받은 메모리를 다 쓰고도 반환하지 않아, 그 영역을 더 이상 쓸 수도 회수할 수도 없게 되는 현상
  • 해제 누락 — 동적으로 할당한 메모리를 해제하지 않고 그 주소를 담은 변수가 사라진 경우
  • 참조가 남아 있는 경우 — 더 쓰지 않는 객체를 컬렉션이나 전역 변수가 계속 참조해 회수 대상에서 빠진다
  • 순환 참조 — 두 객체가 서로를 참조하면 참조 계수 방식에서는 계수가 0이 되지 않는다
  • 해제되지 않은 자원 — 파일 핸들, 소켓, 데이터베이스 연결 등을 닫지 않으면 딸린 메모리도 남는다
  • 예외 경로 — 정상 경로에서만 해제하고 예외가 발생한 경로에서 빠뜨리는 경우
  • 실행 시간이 길어질수록 사용 메모리가 단조 증가한다
  • 가용 메모리가 줄어 스와핑이 늘고 스레싱으로 이어진다
  • 끝내 메모리 부족으로 프로세스가 강제 종료된다
  • 장시간 떠 있는 서버 프로세스에서 문제가 드러나며, 짧게 도는 프로그램에서는 종료 시 운영체제가 회수하므로 잘 보이지 않는다
  • 할당과 해제를 같은 계층에서 짝지어 관리한다
  • 언어가 제공하는 자동 해제 장치를 쓴다 — C++ 의 스마트 포인터, 자바와 C# 의 자동 메모리 회수
  • 자동 메모리 회수가 있어도 누수는 생긴다. 회수기는 참조가 없는 것만 치우므로, 쓰지 않는데 참조가 남아 있으면 그대로 쌓인다
  • Valgrind, LeakSanitizer, 힙 덤프 분석 도구로 검출한다

단편화와의 구별

[편집 | 원본 편집]

메모리 단편화는 메모리가 반환되었지만 조각나서 쓰기 어려운 상태이고, 메모리 누수는 반환 자체가 되지 않은 상태다. 증상은 비슷해 보이지만 원인이 다르다.

같이 보기

[편집 | 원본 편집]