4 min read

runtime: out of memory 에 대해

최근 오픈카톡방에서 있었던 일이 생각나서 해당글을 올린다.

 

프로그램을 돌리는데 runtime: out of memory 같은 에러가 출력이 된다는 점이다.

이거를 보고 딱 가상메모리 부족이거나 OS가 32비트문제라고 생각했다.

현대의 OS에서는 프로세스을 메모리를 올릴때 가상메모리 형태로 올린다.

가상메모리의 장점으로는 프로그램마다 논리적으로 독립적인 메모리영역을 가진다는 점이다.

또한 현재 메모리가 4gb여도 프로세스는 총 10기가가 넘어도 사용할수 있게된다.

한마디로 메모리의 영역을 보다 많이 사용할수 있다는 점이다.

 

다필요없고 문제점 2가지를 전부 살펴보자.

윈도우 같은경우 32비트인경우 프로세스당 유저 메모리를 2기가 이상을 못사용한다.

나머지 2기가는 커널 메모리이다. 컴파일옵션을 주면 커널 메모리를 1기가사용하고 유저메모리를 3기가 사용할수 있지만 보통 이런 옵션을 주지않는다.

다음과 같은 코드를 작성하고 실행시켜보자.

그러면 에러가 발생할것인데 종료하지않고 작업관리자로 확인해보자

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int main() {
    while (true) {
        new int[10000000];
   }
   return 0;
}
cs

커밋크기를 한번봐보자 이는 유저메모리에 할당된 메모리를 보여준다. 딱 2기가가 한계치가 보여준다. 이럴경우 64비트 OS와 64Bit 프로그램을 사용하면된다.

 

두번쨰 경우는 가상메모리 부족이다.

이는 가상메모리를 더이상 할당 받지 못하는 경우이다.

가상메모리의 데이터를 물리메모리에 전부 넣을수 없으면 하드디스크의 힘을 빌려 가상메모리를 swap in,out을 한다.

하지만 하드디스크에서도 더 이상 집어넣을수 없다면 바로 위와 같은 에러가 발생한다.

윈도우10기준이지만 설정창에서 다음과 같이 설정할수 있다.

리눅스는 swap이라는 파티션을 추가하거나 만들어야한다. 자세한내용은 다음 링크에 자세히 담겨있다.

http://faq.hostway.co.kr/?mid=Linux_ETC&page=8&document_srl=1443

 

다행히 질문하신분의 top명령어 결과를 받아 원인을 찾아보니 swap메모리가 전혀 할당이 안되어 있어 swap파티션 링크를 주어 문제를 해결했다.

 

오래된 글이지만 현대의 운영체계에 대해 자세히 설명되어있는 글이 있다. 한번 정독해보는걸 추천한다.

http://osinside.net/osinside/osinside.htm