메모리 누수

 

1. 개요

Memory leak.

1. 개요


응용 프로그램에서 데이터를 메모리에 올렸다가, 이것이 쓸모없어지는 시점에서 적절하게 제거되지 않는 것을 물이 새는 '누수'에 빗댄 말이다. 영어를 그대로 읽은 '메모리 릭'이라는 표현으로도 적지 않게 쓰인다.
이것이 지속되면 메모리 자원의 반환이 원활히 되지 않아 이런저런 버그가 생기거나, 아예 프로그램 자체가 리타이어하는 등 헬게이트가 펼쳐진다.[1] 쓰레기 수집 기능은 이를 방지하기 위한 기능이지만 완전하지는 않다. 발적화의 원흉 중 하나.
메모리에 데이터가 남아 있어도 그 상황을 운영체제가 통제하고 있다면 데이터 누수라고 하긴 어렵다. Windows Vista 이후의 운영체제 및 안드로이드에선 옛날만큼 메모리 공간이 빡빡하지 않다는 것을 감안하여 사용자가 종료시킨 프로그램을 일부러 메모리 상에 남겨두어 나중에 사용자가 다시 찾았을 때 더 빠르게 응답할 수 있도록 설정되어 있다. 하지만 이 경우는 운영체제가 현재 상황을 알면서 일부러 놔둔 것이므로 사용자가 다른 작업을 하느라 메모리 공간이 부족해지면 운영체제가 알아서 메모리를 정리해준다. 다만 윈도우 10 1703부터는 저 정리의 반응속도가 느려서 고사양 게임에서 마이크로스터터링을 일으키는 문제가 있었다.# 게임 자체 최적화 문제와 맞물려서 큰 논란이 된 가장 대표적인 사례가 바로 PUBG (톰 클랜시의 디비전 2의 사례를 포함한 설명 #)
그리고 윈도 모바일은 메모리가 빡빡한데도 기본 설정으론 이렇게 동작해서 문제였다.
한편 FORTRAN이나 BASIC, C 등의 프로그래밍 언어는 쓰레기 수집을 지원하지 않는다. 애초에 이 언어들은 프로그래머를 믿고 컴파일러의 개입을 최소화하는 게 특징이니.. C++의 경우, C++11 이후 추가된 스마트 포인터에서 참조 횟수 카운팅 쓰레기 수집을 지원하지만, 어디까지나 선택사항이고 성능 하락을 막기 위해 직접 관리해야 하는 부분도 적지 않다. 사전공 프로그래머는 오늘도 메모리와의 전쟁을 치르고 있다... 지못미.
[1] 특히 메모리 사용량이 높고 실시간 물리엔진 활용이 많은 콘솔 3D 게임의 경우 이 문제가 심각한데, 대표적인 것이 X-COM 시리즈이며 게임을 오래 플레이 할 수록 누수 메모리 때문에 각종 버그가 터져나오다가 결국 메모리가 다 차면 다운되는 현상을 경험할 수 있다. 이런 현상이 발생하는 게임들에서 유저가 할 수 있는 것은 메모리 용량을 늘려 다운되는 것을 늦추는 것밖에 없다.