Memory leak.
응용 프로그램에서 데이터를
메모리에 올렸다가, 이것이 쓸모없어지는 시점에서 적절하게 제거되지 않는 것을 '
누수'에 빗댄 말이다.
영어를 그대로 읽은 '메모리 릭'이라는 표현으로도 적지 않게 쓰인다.
이것이 지속되면 메모리 자원의 반환이 원활히 되지 않아 이런저런
버그가 생기거나, 아예 프로그램 자체가
리타이어하는 등
헬게이트가 펼쳐진다.
[1] 일반적으로는 메모리가 계속 불어나다가 멈추지만 가끔 램 여유가 충분히 된다면 한계까지 잡아먹는 버그로 유명한 프로그램들도 있었다.
[2] 32비트 윈도우에선 프로그램당 최대 점유할 수 있는 메모리가 2G라 메모리 누수가 발생할 경우 64비트보다 빨리 터진다.
쓰레기 수집 기능은 이를 방지하기 위한 기능이지만 완전하지는 않다.
발적화의 원흉 중 하나.
메모리에 데이터가 남아 있어도 그 상황을 운영체제가 통제하고 있다면 데이터 누수라고 하긴 어렵다.
Windows Vista 이후의 운영체제 및
안드로이드에선 옛날만큼 메모리 공간이 빡빡하지 않다는 것을 감안하여 사용자가 종료시킨 프로그램을 일부러 메모리 상에 남겨두어 나중에 사용자가 다시 찾았을 때 더 빠르게 응답할 수 있도록 설정되어 있다. 여기서 한술 더 떠서 자주 사용하는 프로그램이라면 부팅 이후로 아직 실행된 적이 없더라도, 운영체제가 먼저 메모리에 띄워놓기까지 한다.
[3] 이러한 메커니즘을 윈도우에선 superfetch, 리눅스에선 readahead라고 부른다. 하지만 메모리에 데이터를 미리 올리기 위해 때론 렉을 유발하기도 한다. 윈도우에서 아무 작업도 안 하고 있는데 저장장치 혼자 바쁘다면 superfetch 때문인 경우가 많다.
하지만 이런 경우들은 운영체제가 현재 상황을 알면서 일부러 놔둔 것이므로 사용자가 다른 작업을 하느라 메모리 공간이 부족해지면 운영체제가 알아서 메모리를 정리해준다.
[4] 그래서 최근 실행 목록에서 모두닫기를 누르지 말라고 하는 이유다.
다만
윈도우 10 1703부터는 저 정리의 반응속도가 느려서 고사양 게임에서
마이크로스터터링을 일으키는 문제가 있었다.
# 게임 자체 최적화 문제와 맞물려서 큰 논란이 된 가장 대표적인 사례가 바로
PUBG (
톰 클랜시의 디비전 2의 사례를 포함한 설명
#) 그리고
윈도 모바일은 메모리가 빡빡한데도 기본 설정으론 이렇게 동작해서 문제였다.
[5] 사실 초기 Android도 메모리를 한번씩 정리해줘야 했다.
한편
FORTRAN이나
BASIC,
C 등의
프로그래밍 언어는 쓰레기 수집을 지원하지 않는다. 애초에 이 언어들은 프로그래머를 믿고 컴파일러의 개입을 최소화하는 게 특징이니. 특히 C/C++은 포인터와 동적 할당이 기본 테크닉이라 더 심하다.
C++의 경우, C++11 이후 추가된 스마트 포인터에서
참조 횟수 카운팅 쓰레기 수집을 지원하지만, 어디까지나 선택사항이고 성능 하락을 막기 위해 직접 관리해야 하는 부분도 적지 않다. 이에 따라
FORTRAN,
BASIC,
C,
C++ 전공의 프로그래머는 오늘도 메모리와의 전쟁을 치르고 있다.
이 문서의 내용 중 전체 또는 일부는
문서의
r45 판{{{#!wiki style="display: inline; display: 1.2;"
,
1.2번 문단}}}에서 가져왔습니다.
이전 역사 보러 가기 이 문서의 내용 중 전체 또는 일부는 다른 문서에서 가져왔습니다.
- [ 펼치기 · 접기 ]
문서의
r45 판{{{#!wiki style="display: inline; display: 1.2;"
,
1.2번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
문서의
r 판{{{#!wiki style="display: inline; display: none;"
,
번 문단}}} (
이전 역사)
이 문서의 내용 중 전체 또는 일부는 2023-11-27 16:51:16에 나무위키
메모리 누수 문서에서 가져왔습니다.