메모리 부족(Out of memory) 오류 해소 방안을 델파이 기준으로 설명합니다.
증상
윈도우즈 기반 애플리케이션 시작 또는 실행 중 Out of memory 예외(Exception)이 발생
원인
- 데스크탑 힙 제한에 의한 메모리 부족
- 메모리 누수(Leak)에 의한 메모리 부족
- 과도한 메모리 사용에 의한 메모리 부족
조치방법
데스크탑 힙 제한에 의한 메모리 부족
데스크탑 힙 제한에 의한 메모리 부족 오류가 발생할 수 있습니다.
마이크로소프트 지원 페이지에서 레지스트리를 수정하는 해결 방법을 안내합니다.
메모리 누수(Leak)에 의한 메모리 부족
프로그램내에서 할당된 메모리를 사용 후 반환하지 않는 메모리 누수가 반복될 경우 메모리 부족이 발생합니다.
델파이에서는 FastMM 메모리 관리자(2006 이후 기본 제공)의 정지 시 메모리 누수 보고 기능을 이용해 애플리케이션 종료 시 메모리 누수 보고를 받을 수 있습니다.
종료 시 메모리 누수 보고 기능을 활성화 하려면
- ReportMemoryLeaksOnShutdown 전역 변수를 True로 설정합니다.
- 보통 프로젝트 파일에 선언합니다.
begin ReportMemoryLeaksOnShutdown := True; Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); Application.Run; end. |
- 프로그램 종료 시 메시지 박스를 통해 누수된 내용을 표시합니다.
- 생성 후 해재하지 않은 객체의 클래스명과 크기, 갯수를 알려줍니다.
- 단, 어느 지점에서 발생한지는 알 수 없습니다.
- 되도록, 개발시점에 메모리 릭을 파악하는 용도록 활용하는 것이 좋습니다.
과도한 메모리 사용에 의한 메모리 부족
시스템 상의 메모리보다 과도한 메모리를 사용한 경우 메모리 부족 오류가 발생할 수 있습니다.
이경우 작은 범위의 테스트에서 문제가 발생하지 않다가, 실사용 시 문제가 발생할 수 있습니다.
보통 다수의 UI 컨트롤들을 갖는 화면 여러개를 동시에 표시하거나, 다수의 응용 프로그램을 동시에 실행하는 경우 발생할 수 있습니다.
이 경우 구현상의 이슈보다는 운영상의 이슈이므로, 운영 중 사용자의 메모리 상태를 모니터링 하고, 동시에 표시할 수 있는 화면을 제한하는 등의 과도한 메모리 사용 방어 장치가 필요합니다.
- 프로세스 메모리 사용량 로그 기록 - 성능 모니터 이용 : http://blog.hjf.pe.kr/466
- 성능 모니터를 이용한 메모리 사용 추적 : https://technet.microsoft.com/library/Dd878107#c
- 윈도우즈 성능 모니터 : https://technet.microsoft.com/ko-kr/library/cc749249(v=ws.11).aspx