메모리 누수 정의에 대한 질문입니다.

kjhkjh724의 이미지

제가 작성한 프로그램이 특별히 메모리를 할당하여 사용하는 부분이 없는대 작업관리자의 프로세스텝에서 메모리가 지속적으로 증가한다면 메모리 누수로 생각해야하나요?

제가 생각하는 메모리 누수란 할당후 제거를 안 해줘서 (new 이후 delete없이 프로그램이 끝나는 경우)생기는 것을 대표적으로 알고 있는대요(그리고 저는 이 메모리 누수는 전원을 제거(Ram 은 휘발성임으로)하기 전까지 컴퓨터가 인지하지 못함으로 사용할수 없다고 알고있습니다.).

만약에 소스코드적으로 할당이후 지속적으로 증가하지만 그 증가의 원인이 버퍼로써 사용되는 메모리 양의 증가 즉 생성량의 속도가 처리량의 속도를 뛰어넘은경우 하지만 프로그램 종료와 동시에 모든 버퍼를 풀어주는 것이라면 또 그런 상황에서 버퍼에 대한 통제를 할수 없다면 이것도 메모리 누수라고 할수 있을까요?

이런 의문을 갖게된 원인이 지금 프로그래밍 하고 있는 프로그램이 메모리 증가가 눈으로 확인되고 (작업관리자 프로세스탭 메모리) 프로그램 종료와 동시에 프로세스가 아무 이상없이 종료되며(debug가 모든 Memory Leak을 체크하는건 아니겠지만 이 경우 Memory Leak경고도 없었음.) 프로그램 내용을 확인해 봐도 할당하는 부분이 없을 뿐만 아니라 이러한 일이 발생하는 코드 부분이 라이브러리 함수를 그대로 사용한 부분(SerialPort Write함수)임이 확인이 되어서 생각해 보게되었습니다. 내가 컨트롤 할수 없지만 인지하고 있는 메모리는 메모리 누수로 볼수 있는가? 요약하자면 이런 내용입니다.

shint의 이미지

- 프로그램 실행하지 않고. 확인

- 배열에 범위를 넘은 경우. (디버그 포함) if() 문을 뛰어 넘는 경우도 있습니다.
- 스레드. 핸들. GDI. 프로세스(파일디스크립터) 등에 갯수 확인
- 프로세스 점유율. 메모리 점유율. 하드 점유율 확인

- try catch 사용 (책. 인터넷 검색)
- 디버깅 도구 사용. ㅇ_ㅇ;; 전 VC만 해서. 다른건 거의 사용해본적이 없네요...

- 소스코드를 한줄씩 지워서 확인 혹은 printf()와 파일로 기록해서 확인.
- 서비스 프로그램 하나씩 확인

- 바이러스 방화벽 확인.

- 전문가에게 문의 ㅇ_ㅇ;;

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

twinwings의 이미지

우선 시스템의 자원이라는게, 메모리만 생각하기 쉬운데

네트워크 소켓, 파일 소켓, IPC 소켓, 폰트, 기타 등등..도 자원입니다.

운영체제가 추상적인 개념(리눅스에서는 파일디스크립터, 윈도에서는 핸들이라는 이름)

으로 프로세스에게 제공해주고, 실제로는 운영체제가 메모리를 통해 관리하죠.

프로세스가 이것들을 생성 후 닫지 않았다면? 프로세스가 당연히 메모리를 계속 쥐고 있겠죠.

즉, 사용하지도 않는데 메모리를 들고 있는, 메모리 누수 현상이 일어날 겁니다.

요약하면 꼭 new/malloc 사용 안해도 메모리 누수 있을 수 있다는 얘깁니다.

저라면, 윗 분 말씀하신 것 처럼 쓰레드/핸들/소켓 등의 자원의 개수부터 확인 할 것 같습니다.

shint의 이미지

윈도우 서비스팩 처럼.
리눅스도 업데이트 패치가 있겠네요.

커널 업데이트. 펌웨어 업데이트. 소프트웨어 업데이트 등등...

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

jick의 이미지

제가 이 얘기 kldp에서만 다섯번쯤 하는 것 같은데 -_-

> 제가 생각하는 메모리 누수란 할당후 제거를 안 해줘서 (new 이후 delete없이 프로그램이 끝나는 경우)생기는 것을 대표적으로 알고 있는대요(그리고 저는 이 메모리 누수는 전원을 제거(Ram 은 휘발성임으로)하기 전까지 컴퓨터가 인지하지 못함으로 사용할수 없다고 알고있습니다.).

아닙니다. -_-

최근 10년 내에 만들어진 범용 OS에서는 이런 일이 일어나지 않습니다. 제대로 된 OS라면 당연히 메모리를 프로세스 별로 관리하고, 프로세스가 죽으면 그 프로세스가 사용하던 메모리는 모두 회수합니다. 따라서 프로세스가 죽기 직전에 delete를 하든 말든 추후 그 영역을 OS가 사용하는 데는 아무런 지장이 없습니다.

(물론 OS가 관리하는 자원이 메모리만 있는 건 아니니까, 임시 파일 같은 걸 만들고 제대로 지우지 않고 죽는다면 계속 남아있을 수도 있습니다.)

---

그건 그렇다 치고, 결국 문제를 "메모리 누수"로 볼 것이냐 아니냐는 보는 사람의 입장에 따른 문제입니다. 이를테면 프로그램을 거지같이 짜서 유저가 요청을 보낼 때마다 무조건 1KB의 메모리를 새로 할당한 다음 프로세스가 끝날 때까지 잡고 있다가 마지막에 풀어준다면, memory leak의 정의에 따르면 메모리의 위치도 잘 파악하고 있고 마지막에 free를 하니 memory leak이 아니라고 할 수도 있겠지요. 하지만 이 프로그램은 유저가 요청을 백만 번 보내면 그때부터 1GB의 메모리를 쓰지도 않을 거면서 잡아놓고 있게 됩니다. 아무도 이게 괜찮은 상황이라고는 하지 않을 것입니다.

그러니까 실질적으로 중요한 것은 이 프로세스를 얼마나 오랫동안 띄워 놓고 있어야 하느냐, 그리고 띄워놓고 있는 동안 메모리가 끝없이 증가하느냐 아니면 어느 정도 증가하다가 멈추느냐, 이 프로그램을 돌리는 컴퓨터의 메모리는 얼마나 넉넉하냐 이런 걸 따져보는 게 중요하겠습니다.

kjhkjh724의 이미지

그러하군요...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.