free 시도 중 killed가 발생합니다
글쓴이: heewon / 작성시간: 월, 2014/09/01 - 5:02오후
안녕하세요
며칠동안 검색하고 시도하다 도저히 안되어 질문을 올립니다
저사양 산업용 PC 환경(Geode LX 500MHz, 512RAM, 2GB 저장장치)에서
new로 대량의 메모리 할당을 하고 delete 를 하는 도중 killed가 발생하며 프로그램이 죽습니다
프로세스에서 killed가 발생하면서 죽는 현상을 찾아 본 결과
out of memory가 발생하여 oom killer가 제 프로세스를 kill하는 것이라고 하는데
new할 때 out of memory가 발생하는 상황에 out of memory가 발생하여 kill이 되었다면 이해가 갑니다만 메모리를 해제하는 도중에 왜 out of memory가 발생하는 것인지 이해가 가질 않습니다
이 상황에서 out of memory가 발생할 수 도 있는 것인가요?
또한 메모리를 delete를 하는 도중 프로세스가 killed가 발생하며 죽는 현상의 다른 원인을 알고 계시다면 조언 부탁드립니다
※ 해제를 시도하는 메모리는 다형성으로 구현된 클래스들을 동적할당하여 CMap에 add하였구요 이 CMap을 하나씩 iteration하면서 삭제합니다
※ oom-killer를 disable하기 위해 sysctl 옵션 변경 등의 인터넷에 나와있는 절차를 시도해보았는데 먹히지 않았습니다(제 리눅스 커널은 2.4.18-4 입니다)
도움 부탁드립니다
감사합니다
Forums:
유효하지 않은 메모리를 delete 하는 경우
유효하지 않은 메모리를 delete 하는 경우 exception 이 뜨지 않나요?
유효하지 않은 메모리를 delete하는 것은
유효하지 않은 메모리를 delete하는 것은 아닙니다
같은 소스를 다른 PC에서 동작시켰을 때에는 몇번이고 new와 delete를 반복해도 문제가 없거든요
소멸자에 무슨 부가적인 작업이 있는 게 아닌가요?
일단, 다른 PC에서 문제가 없다고 해도 프로그램의 문제가 아니라고 단정할 수 없습니다.
단순히 메모리 반납만 하는 것이 아니고 자체적으로 소멸자와 연관된 메모리 작업 (최적화, 파편화제거 등)이 들어있는 게 아닐까요. 그렇다면 소멸자에서도 메모리 할당 요청->OOM 상황이 일어날 수 있습니다. 실제로 메모리가 부족하지 않다 하더라도 내부 계산 오류 등으로 엉뚱한 양의 메모리를 요청할 경우 OOM이 발생할 수 있겠고 말이죠.
OOM이 뜨는 바로 그 상황을 디버거로 확인해, 소멸자 내부의 어떤 단계에서 예외가 나오는지 파악하시는 게 좋을 듯 합니다.
--
valgrind
"문제가 발생하지 않는" PC에서 valgrind를 이용해 돌려보시고 메모리를 잘못 쓰는 에러가 없나 확인해 보세요.
제법 높은 확률로 에러를 잡을 수 있습니다.
댓글 달기