답변:
충돌을 피하는 것처럼 OOM을 피할 것입니다.
한 번에 엄청난 양의 작업을 수행하지 말고 많은 양의 메모리를 할당하십시오. 디스크에 데이터를 유지하고 OS 디스크 캐시를 신뢰하며 가능한 한 메모리 매핑 된 IO를 사용하며 한 번에 작은 데이터 부분에서만 작동합니다. 대량의 데이터를 온라인 (낮은 대기 시간으로 제공)해야하는 경우 모든 대형 검색 엔진 회사와 마찬가지로 여러 컴퓨터의 메모리에 데이터를 보관하십시오. 또는 SSD를 구입하십시오.
이 질문에 대답하는 대부분의 사람들은 아마도 malloc이 0을 반환하는 것이 실제로 가능한 임베디드 시스템에서 일한 적이 없을 것입니다. 현재 작업중 인 시스템에는 총 4.25K 바이트의 RAM (4352 바이트)이 있습니다. 스택에 64 바이트를 할당하고 있으며 현재 1600 바이트 힙이 있습니다. 어제 힙 워크 루틴을 디버깅하여 메모리 할당 및 해제를 수행 할 수있었습니다. 힙 워크는 작은 (30 바이트) 정적으로 할당 된 버퍼를 사용하여 직렬 포트로 출력합니다. 릴리스 버전에서는 해제됩니다.
이 제품은 소비자 제품이므로 제품이 출시되면 메모리가 부족하지 않는 것이 좋습니다. 개발 중에는 확실합니다. 어쨌든, 내가 할 수있는 일은 스피커에 몇 번 경고음을 내고 강제로 재부팅하는 것입니다.
솔직히 말해서, 내가 한 모든 프로젝트에서 (아직 아무데도 일하지 않는다는 것을 명심하십시오), 나는 그것이 일어날 수 있다고 생각한 적이 없으므로 프로그램이 매우 빨리 죽을 것이라고 생각합니다.
또한 OOM을 처리하려면 오류 메시지를 표시하거나 모든 것을 저장하기 위해 리소스를 미리 할당해야하므로 불편할 수 있습니다.
요즘 땅콩보다 메모리 비용이 적게 들지만 자주 일어나는 일이 아니라고 생각합니다. 보호 된 기억의 시작과 그 이전에, 그것은 아마도 걱정 이었지만 지금은? 내가 본 유일한 OOM 오류는 버그가있는 코드에서 발생한 것입니다.
malloc 리턴 코드 확인은 일반적으로 아무 의미가 없습니다.
최신 운영 체제는 메모리를 초과 커밋합니다. 실제로 사용 가능한 것보다 많은 메모리를 프로세스에 제공합니다. 프로세스에 부여 된 메모리는 가상이며 모두 단일 제로 아웃 페이지에 매핑됩니다.
물리적이고 고유 한 페이지가 프로세스에 할당되는 것은 메모리에 쓸 때까지는 아닙니다. 이 할당이 실패하면 커널은 메모리를 찾으려고 시도하는 프로세스 (아마도 당신의 것!)를 종료합니다. 이 시점에서 더 이상 할 수있는 일은 없습니다.
임베디드 시스템, 실시간 시스템 또는 실패로 인해 생명 또는 수십억 달러의 비용이 발생할 수있는 매우 중요한 시스템을 개발하지 않는 한 메모리 부족 상황에 대해 걱정할 가치가있는 것은 아닙니다.
대부분의 경우, 새로운 객체를 생성하거나 무언가를 수행 할 수있는 작업을 수행 할 메모리가 없기 때문에 어쨌든 메모리가 부족할 때 수행 할 수있는 작업이 거의 없습니다. OOM을 처리하는 앱과 OOM의 이점을 비교해야합니다.
항상 오류를 확인합니다. 무언가가 오류 조건을 반환하면 프로그램에서 처리해야합니다. "메모리가 부족합니다!"라는 메시지 일지라도 "액세스 위반", "코어 덤프"또는 그 밖의 것보다 낫습니다. 하나는 처리하는 오류 상태이고 다른 하나는 버그입니다. 그리고 사용자는 그것을 그대로 인식 할 것입니다.
특정 경우에 대해 작업을 롤백하고 실패 지점에 도달하고 오류를보고하며 실행을 계속할 때까지 할당 한 리소스를 해제하려고 시도 할 수 있습니다 (응용 프로그램을 종료하려고 할 때 즉시 종료 옵션). 이런 식으로 사용자는 무엇을해야할지 결정하거나 파일을 닫거나 닫는 등의 방법으로 메모리를 확보하려고 할 수 있습니다. 물론 상황을 처리하는 방법은 프로그램에 크게 의존합니다. 대화식으로 오류를 기록하고 종료하거나 계속하면됩니다.