힙 메모리 max 할당

dudtkd4567의 이미지

힙 메모리 할당가능한 총 용량을 측정해보기 위해 무한루프로 힙을 할당했습니다.

근데, 다음과 같은 결과가 나왔습니다.

char* a;
int i = 0;
 
while (1)
{
	a = new char;
	if (++i % 1000000 == 0)
		cout << i/1000000 << " MB" << endl;
}

다음 코드로 돌린 결과 42MB까지 할당되는 것을 봤습니다.
근데 첨부 사진을 보시면 아시겠지만, 전 힙을 1MB까지만 할당하도록 설정했는데, 저렇게 되니 이상합니다.

그리고, 42MB할당했는데 작업관리자 들어가보니 메모리를 2GB이상 먹더라구요, 이것도 너무 이상합니다.

왜그런걸까요?

File attachments: 
첨부파일 크기
Image icon 힙_속성.PNG72.05 KB
Image icon 힙_메모리.PNG92.21 KB
익명 사용자의 이미지

1. 힙 예약 크기(Size of Heap Reservation)가 힙의 최대 크기를 가리키는 것인지는 관련 문서를 좀 찾아봐야 할 것 같군요. 근데 제 생각으로는 딱히 그런 제약이 있어야 할 필요가 있는지 모르겠습니다. 힙은 프로세서 주소 공간과 가용 메모리가 허용하는 한 동적으로 얼마든지 커질 수 있는 것 아니겠어요?

2. new char;를 이용해서 메모리를 1바이트씩 할당 받고 있군요.
C/C++의 메모리 동적 할당은 아래와 같은 이유로 요청한 것보다 더 많은 메모리를 할당하는 경우가 많습니다.

(1) 각 메모리 할당에 따르는 메타데이터를 저장할 공간이 필요합니다.
(2) 미할당된 영역을 추적하기 위한 메타데이터도 유지해야 하지요.
(3) Memory align 문제도 있지요. char에는 align 조건이 없지만, malloc이 반환하는 메모리는 어떤 타입에 대해서도 align을 만족해야 한다는 조건이 있는 걸로 알고 있는데, new에 대해서는 잘 모르겠군요. 어쨌건 malloc이나 new 따위가 반환하는 메모리 주소를 살펴보면 4~8의 배수라던가 하는 경우가 많을 겁니다. 당연히 1바이트씩 할당하면 align에 맞지 않는 영역은 낭비됩니다.

제가 예전에 봤던 어떤 구현은 메모리를 항상 16의 배수로만 할당하더군요. 구체적인 비율은 구현마다 다르겠지만, 아무튼 이런 자잘하고 많은 메모리 할당은 overhead가 상당히 큽니다.

코드를 고쳐서 메모리 할당 단위를 한번에 꽤 크게(최소 16, 크게는 4096 정도) 할당받게 만들면 문제가 좀 완화될 겁니다.

dudtkd4567의 이미지

감사합니다. 아직도 제가 모르는 지식이 많군요.
말씀해주신것들로 다시 공부해서 시도해보겠습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.