OOM(Out Of Memory)이란 사용자에게 보이는 앱의 비정상 종료는 대부분 예외 발생에 따른 Crash가 그 원인이지만, 기타 주요 원인으로는 Out Of Memory(OOM)를 들 수 있다. 애플리케이션이 대량의 메모리를 이용하여 시스템 메모리가 부족해지면, OS에 따라 해당 앱은 강제로 종료된다. 일반적으로 사용자에게 보이지 않는(백그라운드 또는 작동하지 않는) 앱이 우선 종료되지만, 앱이 표시되고 있는 상태에서도 대량의 메모리를 소모하여 시스템 메모리가 부족해지면 OS에 의해 강제로 종료된다.
OOM에 의해 앱이 종료되는 경우, 앱 프로세스 내부에서 이벤트를 취득할 수 없으며, 앱 프로세스 외부에서 강제로 종료되기 때문에 정확하게 OOM을 검출할 수 없다. 또한, 앱이 표시된 상태에서 프로세스가 종료되는 것은 일반적으로 비정상 종료로서, 그 중에 OOM에 의한 종료도 포함된다. 따라서, 앱이 표시되는 동안 프로세스가 종료된 경우, 다음과 같은 절차에 따라 종료 원인을 판정하고, 다음에 실행될 때 OOM 발생을 알린다.
아래는 OOM 검출 프로세스를 도식화한 것이다.
또는 OOM Error는 CNN, transfer learning 할 때, 특히 무거운 모델을 돌릴때도 만나게될 수 있다. 이럴 때는 기본적으로 Batch Size를 줄이거나 process를 kill 하여 메모리를 확보하여야한다. 다만 학습 프로세스를 중간에 강제로 종료를 했을 때 간혹 프로세스가 완전히 종료되지 않고 GPU 메모리에 데이터가 남아 좀비 프로세스가 되는 경우가 있기에 PID를 알아내 직접 kill 해주어야 할 때도 있다.
참고 자료
https://chaelin0722.github.io/etc/OOM/