Does malloc reserve more space while allocating memory? The Next CEO of Stack OverflowMemory usage doesn't decrease when free() usedWill malloc implementations return free-ed memory back to the system?How do I free memory in C?Improve INSERT-per-second performance of SQLite?Some memory seems to be left allocated after malloc() and free()Does dynamic memory allocation differ in C and C++ in popular implementations?Does Malloc only use the heap if requested memory space is large?Allocating more memory than there exists using mallocWhat does “Memory allocated at compile time” really mean?Why Linux Free command is not showing less free memory when I run a process which keeps on allocating memoryWhat are the contents of the memory just allocated by `malloc()`?Memory allocation and process memory useWhy is virtual memory allocated with malloc not released?

Strange use of "whether ... than ..." in official text

Small nick on power cord from an electric alarm clock, and copper wiring exposed but intact

Which one is the true statement?

Reference request: Grassmannian and Plucker coordinates in type B, C, D

Why is the US ranked as #45 in Press Freedom ratings, despite its extremely permissive free speech laws?

0-rank tensor vs vector in 1D

Is it professional to write unrelated content in an almost-empty email?

How to get the last not-null value in an ordered column of a huge table?

Is it correct to say moon starry nights?

How did Beeri the Hittite come up with naming his daughter Yehudit?

(How) Could a medieval fantasy world survive a magic-induced "nuclear winter"?

Can I board the first leg of the flight without having final country's visa?

Where do students learn to solve polynomial equations these days?

Yu-Gi-Oh cards in Python 3

free fall ellipse or parabola?

How to find image of a complex function with given constraints?

Is a distribution that is normal, but highly skewed, considered Gaussian?

"Eavesdropping" vs "Listen in on"

Lucky Feat: How can "more than one creature spend a luck point to influence the outcome of a roll"?

Expressing the idea of having a very busy time

Does higher Oxidation/ reduction potential translate to higher energy storage in battery?

How to avoid supervisors with prejudiced views?

How to set page number in right side in chapter title page?

Is it okay to majorly distort historical facts while writing a fiction story?



Does malloc reserve more space while allocating memory?



The Next CEO of Stack OverflowMemory usage doesn't decrease when free() usedWill malloc implementations return free-ed memory back to the system?How do I free memory in C?Improve INSERT-per-second performance of SQLite?Some memory seems to be left allocated after malloc() and free()Does dynamic memory allocation differ in C and C++ in popular implementations?Does Malloc only use the heap if requested memory space is large?Allocating more memory than there exists using mallocWhat does “Memory allocated at compile time” really mean?Why Linux Free command is not showing less free memory when I run a process which keeps on allocating memoryWhat are the contents of the memory just allocated by `malloc()`?Memory allocation and process memory useWhy is virtual memory allocated with malloc not released?










27















I am observing the following behavior in my test program:



I am doing malloc() for 1 MB and then free() it after sleep(10). I am doing this five times. I am observing memory consumption in top while the program is running.



Once free()-d, I am expecting the program's virtual memory (VIRT) consumption to be down by 1 MB. But actually it isn't. It stays stable. What is the explanation for this behavior? Does malloc() do some reserve while allocating memory?










share|improve this question
























  • Related: How do I free memory in C?

    – Lundin
    Mar 22 at 13:51






  • 2





    Possible duplicate of Memory usage doesn't decrease when free() used

    – Useless
    Mar 22 at 16:29






  • 2





    @Useless This question has better answers than the older one so I've bucked convention and marked the old question a duplicate of this one.

    – John Kugelman
    Mar 22 at 18:32











  • I think nearly all malloc/free implementations use some internal management which does request larger chunks and free them opportunistically. This may use brk(2) or mmap. It also means that pages might not actually get used before touched (and sometimes even uncommitted on free, so the virtual or data segment size is not so important)

    – eckes
    Mar 22 at 19:42















27















I am observing the following behavior in my test program:



I am doing malloc() for 1 MB and then free() it after sleep(10). I am doing this five times. I am observing memory consumption in top while the program is running.



Once free()-d, I am expecting the program's virtual memory (VIRT) consumption to be down by 1 MB. But actually it isn't. It stays stable. What is the explanation for this behavior? Does malloc() do some reserve while allocating memory?










share|improve this question
























  • Related: How do I free memory in C?

    – Lundin
    Mar 22 at 13:51






  • 2





    Possible duplicate of Memory usage doesn't decrease when free() used

    – Useless
    Mar 22 at 16:29






  • 2





    @Useless This question has better answers than the older one so I've bucked convention and marked the old question a duplicate of this one.

    – John Kugelman
    Mar 22 at 18:32











  • I think nearly all malloc/free implementations use some internal management which does request larger chunks and free them opportunistically. This may use brk(2) or mmap. It also means that pages might not actually get used before touched (and sometimes even uncommitted on free, so the virtual or data segment size is not so important)

    – eckes
    Mar 22 at 19:42













27












27








27


2






I am observing the following behavior in my test program:



I am doing malloc() for 1 MB and then free() it after sleep(10). I am doing this five times. I am observing memory consumption in top while the program is running.



Once free()-d, I am expecting the program's virtual memory (VIRT) consumption to be down by 1 MB. But actually it isn't. It stays stable. What is the explanation for this behavior? Does malloc() do some reserve while allocating memory?










share|improve this question
















I am observing the following behavior in my test program:



I am doing malloc() for 1 MB and then free() it after sleep(10). I am doing this five times. I am observing memory consumption in top while the program is running.



Once free()-d, I am expecting the program's virtual memory (VIRT) consumption to be down by 1 MB. But actually it isn't. It stays stable. What is the explanation for this behavior? Does malloc() do some reserve while allocating memory?







c malloc free dynamic-memory-allocation






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Mar 22 at 21:25









Peter Mortensen

13.8k1987113




13.8k1987113










asked Mar 22 at 7:45









user1228352user1228352

158111




158111












  • Related: How do I free memory in C?

    – Lundin
    Mar 22 at 13:51






  • 2





    Possible duplicate of Memory usage doesn't decrease when free() used

    – Useless
    Mar 22 at 16:29






  • 2





    @Useless This question has better answers than the older one so I've bucked convention and marked the old question a duplicate of this one.

    – John Kugelman
    Mar 22 at 18:32











  • I think nearly all malloc/free implementations use some internal management which does request larger chunks and free them opportunistically. This may use brk(2) or mmap. It also means that pages might not actually get used before touched (and sometimes even uncommitted on free, so the virtual or data segment size is not so important)

    – eckes
    Mar 22 at 19:42

















  • Related: How do I free memory in C?

    – Lundin
    Mar 22 at 13:51






  • 2





    Possible duplicate of Memory usage doesn't decrease when free() used

    – Useless
    Mar 22 at 16:29






  • 2





    @Useless This question has better answers than the older one so I've bucked convention and marked the old question a duplicate of this one.

    – John Kugelman
    Mar 22 at 18:32











  • I think nearly all malloc/free implementations use some internal management which does request larger chunks and free them opportunistically. This may use brk(2) or mmap. It also means that pages might not actually get used before touched (and sometimes even uncommitted on free, so the virtual or data segment size is not so important)

    – eckes
    Mar 22 at 19:42
















Related: How do I free memory in C?

– Lundin
Mar 22 at 13:51





Related: How do I free memory in C?

– Lundin
Mar 22 at 13:51




2




2





Possible duplicate of Memory usage doesn't decrease when free() used

– Useless
Mar 22 at 16:29





Possible duplicate of Memory usage doesn't decrease when free() used

– Useless
Mar 22 at 16:29




2




2





@Useless This question has better answers than the older one so I've bucked convention and marked the old question a duplicate of this one.

– John Kugelman
Mar 22 at 18:32





@Useless This question has better answers than the older one so I've bucked convention and marked the old question a duplicate of this one.

– John Kugelman
Mar 22 at 18:32













I think nearly all malloc/free implementations use some internal management which does request larger chunks and free them opportunistically. This may use brk(2) or mmap. It also means that pages might not actually get used before touched (and sometimes even uncommitted on free, so the virtual or data segment size is not so important)

– eckes
Mar 22 at 19:42





I think nearly all malloc/free implementations use some internal management which does request larger chunks and free them opportunistically. This may use brk(2) or mmap. It also means that pages might not actually get used before touched (and sometimes even uncommitted on free, so the virtual or data segment size is not so important)

– eckes
Mar 22 at 19:42












3 Answers
3






active

oldest

votes


















42















Once free()-d, I am expecting program's virtual memory (VIRT) consumption to be down by 1MB.




Well, this is not guaranteed by the C standard. It only says, once you free() the memory, you should not be accessing that any more.



Whether the memory block is actually returned to the available memory pool or kept aside for future allocations is decided by the memory manager.






share|improve this answer




















  • 1





    Is it possible to release the free()'d memory block back to OS?

    – user1228352
    Mar 22 at 7:59






  • 8





    @user1228352 no, the C language doesn't allow this. If you want more control, you need to implement your own memory manager that relies on platform specific OS system calls.

    – Jabberwocky
    Mar 22 at 8:30






  • 8





    @user1228352 I understand the feeling after this, let's say trickery, however - you really don't want to go that way, nor it makes sense in the long-term approach because it's just a waste of time for you to figure out how to make your own memory manager (if allowed by the OS) and debug it. Go by the C standard and you'll have more comfortable experience, while the OS does the thing it's made for. Well, unless your target is to make your own OS, but then you probably wouldn't ask this question.

    – KeyWeeUsr
    Mar 22 at 14:15











  • @user1228352 Why would you want to? Virtual memory is effectively free.

    – David Schwartz
    Mar 22 at 23:27






  • 2





    Why would you want to reduce the unnecessary consumption of something that is not scarce? You should tell us a lot more about your environment if you want a helpful answer. Some unusual environments also have unusual implementations of malloc and free. If you have a real issue (and this isn't just cosmetic) you could replace the allocator with one that never holds any extra virtual memory but there's about a 99% chance it will just make things worse due to issues like fragmentation.

    – David Schwartz
    Mar 23 at 18:41


















27














The C standard doesn't force on the implementer of malloc and free to return the memory to the OS directly. So different C library implementations will behave differently. Some of them might give it back directly and some might not. In fact, the same implementation will also behave differently depending on the allocation sizes and patterns.



This behavior, of course, is for good reasons:



  1. It is not always possible. OS-level memory allocations usually are done in pages (4KB, 4MB, or ... sizes at once). And if a small part of the page is still being used after freeing another part then the page cannot be given back to the operating system until that part is also freed.

  2. Efficiency. It is very likely that an application will ask for memory again. So why give it back to the OS and ask for it again soon after. (of course, there is probably a limit on the size of the memory kept.)

In most cases, you are not accountable for the memory you free if the implementation decided to keep it (assuming it is a good implementation). Sooner or later it will be reallocated or returned to the OS. Hence, optimizing for memory usage should be based on the amount you have malloc-ed and you haven't free-d. The case where you have to worry about this, is when your allocation patterns/sizes start causing memory fragmentation which is a very big topic on its own.



If you are, however, on an embedded system and the amount of memory available is limited and you need more control over when/how memory is allocated and freed then you need to ask for memory pages from the OS directly and manage it manually.



Edit: I did not explain why you are not accountable for memory you free.
The reason is, on a modern OS, allocated memory is virtual. Meaning if you allocate 512MB on 32-bit system or 10TB of 64-bit system, as long as you don't read or write to that memory, it will not reserve any physical space for it. Actually, it will only reserve physical memory for the pages you touch from that big block and not the entire block. And after "a while of not using that memory", its contents will be copied to disk and the underlying physical memory will be used for something else.






share|improve this answer




















  • 1





    Note that some allocators may avoid the possibility of copying data to disk by using OS specific calls that say "these pages aren't in use, so feel free to drop their contents, even though I'm not releasing the virtual memory itself". Example would be using the madvise call on Linux with MADV_DONTNEED.

    – ShadowRanger
    Mar 23 at 5:14











  • @ShadowRanger very interesting to know! thank you.

    – Ameen
    Mar 23 at 5:16


















11














This is very dependent on the actual malloc implementation in use.



Under Linux, there is a threshold (MMAP_THRESHOLD) to decide where the memory for a given malloc() request comes from.



If the requested amount is below or equal to MMAP_THRESHOLD, the request is satisfied by either taking it from the so-called "free list", if any memory blocks have already been free()d. Otherwise, the "break line" of the program (i. e. the end of the data segment) is increased and the memory made available to the program by this process is used for the request.



On free(), the freed memory block is added to the free list. If there is enough free memory at the very end of the data segment, the break line (mentionned above) is moved again to shrink the data segment, returning the excess memory to the OS.



If the requested amount exceeds MMAP_THRESHOLD, a separate memory block is requested by the OS and returned again during free().



See also https://linux.die.net/man/3/malloc for details.






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55294985%2fdoes-malloc-reserve-more-space-while-allocating-memory%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    42















    Once free()-d, I am expecting program's virtual memory (VIRT) consumption to be down by 1MB.




    Well, this is not guaranteed by the C standard. It only says, once you free() the memory, you should not be accessing that any more.



    Whether the memory block is actually returned to the available memory pool or kept aside for future allocations is decided by the memory manager.






    share|improve this answer




















    • 1





      Is it possible to release the free()'d memory block back to OS?

      – user1228352
      Mar 22 at 7:59






    • 8





      @user1228352 no, the C language doesn't allow this. If you want more control, you need to implement your own memory manager that relies on platform specific OS system calls.

      – Jabberwocky
      Mar 22 at 8:30






    • 8





      @user1228352 I understand the feeling after this, let's say trickery, however - you really don't want to go that way, nor it makes sense in the long-term approach because it's just a waste of time for you to figure out how to make your own memory manager (if allowed by the OS) and debug it. Go by the C standard and you'll have more comfortable experience, while the OS does the thing it's made for. Well, unless your target is to make your own OS, but then you probably wouldn't ask this question.

      – KeyWeeUsr
      Mar 22 at 14:15











    • @user1228352 Why would you want to? Virtual memory is effectively free.

      – David Schwartz
      Mar 22 at 23:27






    • 2





      Why would you want to reduce the unnecessary consumption of something that is not scarce? You should tell us a lot more about your environment if you want a helpful answer. Some unusual environments also have unusual implementations of malloc and free. If you have a real issue (and this isn't just cosmetic) you could replace the allocator with one that never holds any extra virtual memory but there's about a 99% chance it will just make things worse due to issues like fragmentation.

      – David Schwartz
      Mar 23 at 18:41















    42















    Once free()-d, I am expecting program's virtual memory (VIRT) consumption to be down by 1MB.




    Well, this is not guaranteed by the C standard. It only says, once you free() the memory, you should not be accessing that any more.



    Whether the memory block is actually returned to the available memory pool or kept aside for future allocations is decided by the memory manager.






    share|improve this answer




















    • 1





      Is it possible to release the free()'d memory block back to OS?

      – user1228352
      Mar 22 at 7:59






    • 8





      @user1228352 no, the C language doesn't allow this. If you want more control, you need to implement your own memory manager that relies on platform specific OS system calls.

      – Jabberwocky
      Mar 22 at 8:30






    • 8





      @user1228352 I understand the feeling after this, let's say trickery, however - you really don't want to go that way, nor it makes sense in the long-term approach because it's just a waste of time for you to figure out how to make your own memory manager (if allowed by the OS) and debug it. Go by the C standard and you'll have more comfortable experience, while the OS does the thing it's made for. Well, unless your target is to make your own OS, but then you probably wouldn't ask this question.

      – KeyWeeUsr
      Mar 22 at 14:15











    • @user1228352 Why would you want to? Virtual memory is effectively free.

      – David Schwartz
      Mar 22 at 23:27






    • 2





      Why would you want to reduce the unnecessary consumption of something that is not scarce? You should tell us a lot more about your environment if you want a helpful answer. Some unusual environments also have unusual implementations of malloc and free. If you have a real issue (and this isn't just cosmetic) you could replace the allocator with one that never holds any extra virtual memory but there's about a 99% chance it will just make things worse due to issues like fragmentation.

      – David Schwartz
      Mar 23 at 18:41













    42












    42








    42








    Once free()-d, I am expecting program's virtual memory (VIRT) consumption to be down by 1MB.




    Well, this is not guaranteed by the C standard. It only says, once you free() the memory, you should not be accessing that any more.



    Whether the memory block is actually returned to the available memory pool or kept aside for future allocations is decided by the memory manager.






    share|improve this answer
















    Once free()-d, I am expecting program's virtual memory (VIRT) consumption to be down by 1MB.




    Well, this is not guaranteed by the C standard. It only says, once you free() the memory, you should not be accessing that any more.



    Whether the memory block is actually returned to the available memory pool or kept aside for future allocations is decided by the memory manager.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Mar 23 at 5:58









    Brian McCutchon

    4,97222136




    4,97222136










    answered Mar 22 at 7:48









    Sourav GhoshSourav Ghosh

    111k15132191




    111k15132191







    • 1





      Is it possible to release the free()'d memory block back to OS?

      – user1228352
      Mar 22 at 7:59






    • 8





      @user1228352 no, the C language doesn't allow this. If you want more control, you need to implement your own memory manager that relies on platform specific OS system calls.

      – Jabberwocky
      Mar 22 at 8:30






    • 8





      @user1228352 I understand the feeling after this, let's say trickery, however - you really don't want to go that way, nor it makes sense in the long-term approach because it's just a waste of time for you to figure out how to make your own memory manager (if allowed by the OS) and debug it. Go by the C standard and you'll have more comfortable experience, while the OS does the thing it's made for. Well, unless your target is to make your own OS, but then you probably wouldn't ask this question.

      – KeyWeeUsr
      Mar 22 at 14:15











    • @user1228352 Why would you want to? Virtual memory is effectively free.

      – David Schwartz
      Mar 22 at 23:27






    • 2





      Why would you want to reduce the unnecessary consumption of something that is not scarce? You should tell us a lot more about your environment if you want a helpful answer. Some unusual environments also have unusual implementations of malloc and free. If you have a real issue (and this isn't just cosmetic) you could replace the allocator with one that never holds any extra virtual memory but there's about a 99% chance it will just make things worse due to issues like fragmentation.

      – David Schwartz
      Mar 23 at 18:41












    • 1





      Is it possible to release the free()'d memory block back to OS?

      – user1228352
      Mar 22 at 7:59






    • 8





      @user1228352 no, the C language doesn't allow this. If you want more control, you need to implement your own memory manager that relies on platform specific OS system calls.

      – Jabberwocky
      Mar 22 at 8:30






    • 8





      @user1228352 I understand the feeling after this, let's say trickery, however - you really don't want to go that way, nor it makes sense in the long-term approach because it's just a waste of time for you to figure out how to make your own memory manager (if allowed by the OS) and debug it. Go by the C standard and you'll have more comfortable experience, while the OS does the thing it's made for. Well, unless your target is to make your own OS, but then you probably wouldn't ask this question.

      – KeyWeeUsr
      Mar 22 at 14:15











    • @user1228352 Why would you want to? Virtual memory is effectively free.

      – David Schwartz
      Mar 22 at 23:27






    • 2





      Why would you want to reduce the unnecessary consumption of something that is not scarce? You should tell us a lot more about your environment if you want a helpful answer. Some unusual environments also have unusual implementations of malloc and free. If you have a real issue (and this isn't just cosmetic) you could replace the allocator with one that never holds any extra virtual memory but there's about a 99% chance it will just make things worse due to issues like fragmentation.

      – David Schwartz
      Mar 23 at 18:41







    1




    1





    Is it possible to release the free()'d memory block back to OS?

    – user1228352
    Mar 22 at 7:59





    Is it possible to release the free()'d memory block back to OS?

    – user1228352
    Mar 22 at 7:59




    8




    8





    @user1228352 no, the C language doesn't allow this. If you want more control, you need to implement your own memory manager that relies on platform specific OS system calls.

    – Jabberwocky
    Mar 22 at 8:30





    @user1228352 no, the C language doesn't allow this. If you want more control, you need to implement your own memory manager that relies on platform specific OS system calls.

    – Jabberwocky
    Mar 22 at 8:30




    8




    8





    @user1228352 I understand the feeling after this, let's say trickery, however - you really don't want to go that way, nor it makes sense in the long-term approach because it's just a waste of time for you to figure out how to make your own memory manager (if allowed by the OS) and debug it. Go by the C standard and you'll have more comfortable experience, while the OS does the thing it's made for. Well, unless your target is to make your own OS, but then you probably wouldn't ask this question.

    – KeyWeeUsr
    Mar 22 at 14:15





    @user1228352 I understand the feeling after this, let's say trickery, however - you really don't want to go that way, nor it makes sense in the long-term approach because it's just a waste of time for you to figure out how to make your own memory manager (if allowed by the OS) and debug it. Go by the C standard and you'll have more comfortable experience, while the OS does the thing it's made for. Well, unless your target is to make your own OS, but then you probably wouldn't ask this question.

    – KeyWeeUsr
    Mar 22 at 14:15













    @user1228352 Why would you want to? Virtual memory is effectively free.

    – David Schwartz
    Mar 22 at 23:27





    @user1228352 Why would you want to? Virtual memory is effectively free.

    – David Schwartz
    Mar 22 at 23:27




    2




    2





    Why would you want to reduce the unnecessary consumption of something that is not scarce? You should tell us a lot more about your environment if you want a helpful answer. Some unusual environments also have unusual implementations of malloc and free. If you have a real issue (and this isn't just cosmetic) you could replace the allocator with one that never holds any extra virtual memory but there's about a 99% chance it will just make things worse due to issues like fragmentation.

    – David Schwartz
    Mar 23 at 18:41





    Why would you want to reduce the unnecessary consumption of something that is not scarce? You should tell us a lot more about your environment if you want a helpful answer. Some unusual environments also have unusual implementations of malloc and free. If you have a real issue (and this isn't just cosmetic) you could replace the allocator with one that never holds any extra virtual memory but there's about a 99% chance it will just make things worse due to issues like fragmentation.

    – David Schwartz
    Mar 23 at 18:41













    27














    The C standard doesn't force on the implementer of malloc and free to return the memory to the OS directly. So different C library implementations will behave differently. Some of them might give it back directly and some might not. In fact, the same implementation will also behave differently depending on the allocation sizes and patterns.



    This behavior, of course, is for good reasons:



    1. It is not always possible. OS-level memory allocations usually are done in pages (4KB, 4MB, or ... sizes at once). And if a small part of the page is still being used after freeing another part then the page cannot be given back to the operating system until that part is also freed.

    2. Efficiency. It is very likely that an application will ask for memory again. So why give it back to the OS and ask for it again soon after. (of course, there is probably a limit on the size of the memory kept.)

    In most cases, you are not accountable for the memory you free if the implementation decided to keep it (assuming it is a good implementation). Sooner or later it will be reallocated or returned to the OS. Hence, optimizing for memory usage should be based on the amount you have malloc-ed and you haven't free-d. The case where you have to worry about this, is when your allocation patterns/sizes start causing memory fragmentation which is a very big topic on its own.



    If you are, however, on an embedded system and the amount of memory available is limited and you need more control over when/how memory is allocated and freed then you need to ask for memory pages from the OS directly and manage it manually.



    Edit: I did not explain why you are not accountable for memory you free.
    The reason is, on a modern OS, allocated memory is virtual. Meaning if you allocate 512MB on 32-bit system or 10TB of 64-bit system, as long as you don't read or write to that memory, it will not reserve any physical space for it. Actually, it will only reserve physical memory for the pages you touch from that big block and not the entire block. And after "a while of not using that memory", its contents will be copied to disk and the underlying physical memory will be used for something else.






    share|improve this answer




















    • 1





      Note that some allocators may avoid the possibility of copying data to disk by using OS specific calls that say "these pages aren't in use, so feel free to drop their contents, even though I'm not releasing the virtual memory itself". Example would be using the madvise call on Linux with MADV_DONTNEED.

      – ShadowRanger
      Mar 23 at 5:14











    • @ShadowRanger very interesting to know! thank you.

      – Ameen
      Mar 23 at 5:16















    27














    The C standard doesn't force on the implementer of malloc and free to return the memory to the OS directly. So different C library implementations will behave differently. Some of them might give it back directly and some might not. In fact, the same implementation will also behave differently depending on the allocation sizes and patterns.



    This behavior, of course, is for good reasons:



    1. It is not always possible. OS-level memory allocations usually are done in pages (4KB, 4MB, or ... sizes at once). And if a small part of the page is still being used after freeing another part then the page cannot be given back to the operating system until that part is also freed.

    2. Efficiency. It is very likely that an application will ask for memory again. So why give it back to the OS and ask for it again soon after. (of course, there is probably a limit on the size of the memory kept.)

    In most cases, you are not accountable for the memory you free if the implementation decided to keep it (assuming it is a good implementation). Sooner or later it will be reallocated or returned to the OS. Hence, optimizing for memory usage should be based on the amount you have malloc-ed and you haven't free-d. The case where you have to worry about this, is when your allocation patterns/sizes start causing memory fragmentation which is a very big topic on its own.



    If you are, however, on an embedded system and the amount of memory available is limited and you need more control over when/how memory is allocated and freed then you need to ask for memory pages from the OS directly and manage it manually.



    Edit: I did not explain why you are not accountable for memory you free.
    The reason is, on a modern OS, allocated memory is virtual. Meaning if you allocate 512MB on 32-bit system or 10TB of 64-bit system, as long as you don't read or write to that memory, it will not reserve any physical space for it. Actually, it will only reserve physical memory for the pages you touch from that big block and not the entire block. And after "a while of not using that memory", its contents will be copied to disk and the underlying physical memory will be used for something else.






    share|improve this answer




















    • 1





      Note that some allocators may avoid the possibility of copying data to disk by using OS specific calls that say "these pages aren't in use, so feel free to drop their contents, even though I'm not releasing the virtual memory itself". Example would be using the madvise call on Linux with MADV_DONTNEED.

      – ShadowRanger
      Mar 23 at 5:14











    • @ShadowRanger very interesting to know! thank you.

      – Ameen
      Mar 23 at 5:16













    27












    27








    27







    The C standard doesn't force on the implementer of malloc and free to return the memory to the OS directly. So different C library implementations will behave differently. Some of them might give it back directly and some might not. In fact, the same implementation will also behave differently depending on the allocation sizes and patterns.



    This behavior, of course, is for good reasons:



    1. It is not always possible. OS-level memory allocations usually are done in pages (4KB, 4MB, or ... sizes at once). And if a small part of the page is still being used after freeing another part then the page cannot be given back to the operating system until that part is also freed.

    2. Efficiency. It is very likely that an application will ask for memory again. So why give it back to the OS and ask for it again soon after. (of course, there is probably a limit on the size of the memory kept.)

    In most cases, you are not accountable for the memory you free if the implementation decided to keep it (assuming it is a good implementation). Sooner or later it will be reallocated or returned to the OS. Hence, optimizing for memory usage should be based on the amount you have malloc-ed and you haven't free-d. The case where you have to worry about this, is when your allocation patterns/sizes start causing memory fragmentation which is a very big topic on its own.



    If you are, however, on an embedded system and the amount of memory available is limited and you need more control over when/how memory is allocated and freed then you need to ask for memory pages from the OS directly and manage it manually.



    Edit: I did not explain why you are not accountable for memory you free.
    The reason is, on a modern OS, allocated memory is virtual. Meaning if you allocate 512MB on 32-bit system or 10TB of 64-bit system, as long as you don't read or write to that memory, it will not reserve any physical space for it. Actually, it will only reserve physical memory for the pages you touch from that big block and not the entire block. And after "a while of not using that memory", its contents will be copied to disk and the underlying physical memory will be used for something else.






    share|improve this answer















    The C standard doesn't force on the implementer of malloc and free to return the memory to the OS directly. So different C library implementations will behave differently. Some of them might give it back directly and some might not. In fact, the same implementation will also behave differently depending on the allocation sizes and patterns.



    This behavior, of course, is for good reasons:



    1. It is not always possible. OS-level memory allocations usually are done in pages (4KB, 4MB, or ... sizes at once). And if a small part of the page is still being used after freeing another part then the page cannot be given back to the operating system until that part is also freed.

    2. Efficiency. It is very likely that an application will ask for memory again. So why give it back to the OS and ask for it again soon after. (of course, there is probably a limit on the size of the memory kept.)

    In most cases, you are not accountable for the memory you free if the implementation decided to keep it (assuming it is a good implementation). Sooner or later it will be reallocated or returned to the OS. Hence, optimizing for memory usage should be based on the amount you have malloc-ed and you haven't free-d. The case where you have to worry about this, is when your allocation patterns/sizes start causing memory fragmentation which is a very big topic on its own.



    If you are, however, on an embedded system and the amount of memory available is limited and you need more control over when/how memory is allocated and freed then you need to ask for memory pages from the OS directly and manage it manually.



    Edit: I did not explain why you are not accountable for memory you free.
    The reason is, on a modern OS, allocated memory is virtual. Meaning if you allocate 512MB on 32-bit system or 10TB of 64-bit system, as long as you don't read or write to that memory, it will not reserve any physical space for it. Actually, it will only reserve physical memory for the pages you touch from that big block and not the entire block. And after "a while of not using that memory", its contents will be copied to disk and the underlying physical memory will be used for something else.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Mar 22 at 18:49

























    answered Mar 22 at 8:53









    AmeenAmeen

    7941620




    7941620







    • 1





      Note that some allocators may avoid the possibility of copying data to disk by using OS specific calls that say "these pages aren't in use, so feel free to drop their contents, even though I'm not releasing the virtual memory itself". Example would be using the madvise call on Linux with MADV_DONTNEED.

      – ShadowRanger
      Mar 23 at 5:14











    • @ShadowRanger very interesting to know! thank you.

      – Ameen
      Mar 23 at 5:16












    • 1





      Note that some allocators may avoid the possibility of copying data to disk by using OS specific calls that say "these pages aren't in use, so feel free to drop their contents, even though I'm not releasing the virtual memory itself". Example would be using the madvise call on Linux with MADV_DONTNEED.

      – ShadowRanger
      Mar 23 at 5:14











    • @ShadowRanger very interesting to know! thank you.

      – Ameen
      Mar 23 at 5:16







    1




    1





    Note that some allocators may avoid the possibility of copying data to disk by using OS specific calls that say "these pages aren't in use, so feel free to drop their contents, even though I'm not releasing the virtual memory itself". Example would be using the madvise call on Linux with MADV_DONTNEED.

    – ShadowRanger
    Mar 23 at 5:14





    Note that some allocators may avoid the possibility of copying data to disk by using OS specific calls that say "these pages aren't in use, so feel free to drop their contents, even though I'm not releasing the virtual memory itself". Example would be using the madvise call on Linux with MADV_DONTNEED.

    – ShadowRanger
    Mar 23 at 5:14













    @ShadowRanger very interesting to know! thank you.

    – Ameen
    Mar 23 at 5:16





    @ShadowRanger very interesting to know! thank you.

    – Ameen
    Mar 23 at 5:16











    11














    This is very dependent on the actual malloc implementation in use.



    Under Linux, there is a threshold (MMAP_THRESHOLD) to decide where the memory for a given malloc() request comes from.



    If the requested amount is below or equal to MMAP_THRESHOLD, the request is satisfied by either taking it from the so-called "free list", if any memory blocks have already been free()d. Otherwise, the "break line" of the program (i. e. the end of the data segment) is increased and the memory made available to the program by this process is used for the request.



    On free(), the freed memory block is added to the free list. If there is enough free memory at the very end of the data segment, the break line (mentionned above) is moved again to shrink the data segment, returning the excess memory to the OS.



    If the requested amount exceeds MMAP_THRESHOLD, a separate memory block is requested by the OS and returned again during free().



    See also https://linux.die.net/man/3/malloc for details.






    share|improve this answer



























      11














      This is very dependent on the actual malloc implementation in use.



      Under Linux, there is a threshold (MMAP_THRESHOLD) to decide where the memory for a given malloc() request comes from.



      If the requested amount is below or equal to MMAP_THRESHOLD, the request is satisfied by either taking it from the so-called "free list", if any memory blocks have already been free()d. Otherwise, the "break line" of the program (i. e. the end of the data segment) is increased and the memory made available to the program by this process is used for the request.



      On free(), the freed memory block is added to the free list. If there is enough free memory at the very end of the data segment, the break line (mentionned above) is moved again to shrink the data segment, returning the excess memory to the OS.



      If the requested amount exceeds MMAP_THRESHOLD, a separate memory block is requested by the OS and returned again during free().



      See also https://linux.die.net/man/3/malloc for details.






      share|improve this answer

























        11












        11








        11







        This is very dependent on the actual malloc implementation in use.



        Under Linux, there is a threshold (MMAP_THRESHOLD) to decide where the memory for a given malloc() request comes from.



        If the requested amount is below or equal to MMAP_THRESHOLD, the request is satisfied by either taking it from the so-called "free list", if any memory blocks have already been free()d. Otherwise, the "break line" of the program (i. e. the end of the data segment) is increased and the memory made available to the program by this process is used for the request.



        On free(), the freed memory block is added to the free list. If there is enough free memory at the very end of the data segment, the break line (mentionned above) is moved again to shrink the data segment, returning the excess memory to the OS.



        If the requested amount exceeds MMAP_THRESHOLD, a separate memory block is requested by the OS and returned again during free().



        See also https://linux.die.net/man/3/malloc for details.






        share|improve this answer













        This is very dependent on the actual malloc implementation in use.



        Under Linux, there is a threshold (MMAP_THRESHOLD) to decide where the memory for a given malloc() request comes from.



        If the requested amount is below or equal to MMAP_THRESHOLD, the request is satisfied by either taking it from the so-called "free list", if any memory blocks have already been free()d. Otherwise, the "break line" of the program (i. e. the end of the data segment) is increased and the memory made available to the program by this process is used for the request.



        On free(), the freed memory block is added to the free list. If there is enough free memory at the very end of the data segment, the break line (mentionned above) is moved again to shrink the data segment, returning the excess memory to the OS.



        If the requested amount exceeds MMAP_THRESHOLD, a separate memory block is requested by the OS and returned again during free().



        See also https://linux.die.net/man/3/malloc for details.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Mar 22 at 14:06









        glglglglglgl

        68k796169




        68k796169



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55294985%2fdoes-malloc-reserve-more-space-while-allocating-memory%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Færeyskur hestur Heimild | Tengill | Tilvísanir | LeiðsagnarvalRossið - síða um færeyska hrossið á færeyskuGott ár hjá færeyska hestinum

            He _____ here since 1970 . Answer needed [closed]What does “since he was so high” mean?Meaning of “catch birds for”?How do I ensure “since” takes the meaning I want?“Who cares here” meaningWhat does “right round toward” mean?the time tense (had now been detected)What does the phrase “ring around the roses” mean here?Correct usage of “visited upon”Meaning of “foiled rail sabotage bid”It was the third time I had gone to Rome or It is the third time I had been to Rome

            Slayer Innehåll Historia | Stil, komposition och lyrik | Bandets betydelse och framgångar | Sidoprojekt och samarbeten | Kontroverser | Medlemmar | Utmärkelser och nomineringar | Turnéer och festivaler | Diskografi | Referenser | Externa länkar | Navigeringsmenywww.slayer.net”Metal Massacre vol. 1””Metal Massacre vol. 3””Metal Massacre Volume III””Show No Mercy””Haunting the Chapel””Live Undead””Hell Awaits””Reign in Blood””Reign in Blood””Gold & Platinum – Reign in Blood””Golden Gods Awards Winners”originalet”Kerrang! Hall Of Fame””Slayer Looks Back On 37-Year Career In New Video Series: Part Two””South of Heaven””Gold & Platinum – South of Heaven””Seasons in the Abyss””Gold & Platinum - Seasons in the Abyss””Divine Intervention””Divine Intervention - Release group by Slayer””Gold & Platinum - Divine Intervention””Live Intrusion””Undisputed Attitude””Abolish Government/Superficial Love””Release “Slatanic Slaughter: A Tribute to Slayer” by Various Artists””Diabolus in Musica””Soundtrack to the Apocalypse””God Hates Us All””Systematic - Relationships””War at the Warfield””Gold & Platinum - War at the Warfield””Soundtrack to the Apocalypse””Gold & Platinum - Still Reigning””Metallica, Slayer, Iron Mauden Among Winners At Metal Hammer Awards””Eternal Pyre””Eternal Pyre - Slayer release group””Eternal Pyre””Metal Storm Awards 2006””Kerrang! Hall Of Fame””Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Bullet-For My Valentine booed at Metal Hammer Golden Gods Awards””Unholy Aliance””The End Of Slayer?””Slayer: We Could Thrash Out Two More Albums If We're Fast Enough...””'The Unholy Alliance: Chapter III' UK Dates Added”originalet”Megadeth And Slayer To Co-Headline 'Canadian Carnage' Trek”originalet”World Painted Blood””Release “World Painted Blood” by Slayer””Metallica Heading To Cinemas””Slayer, Megadeth To Join Forces For 'European Carnage' Tour - Dec. 18, 2010”originalet”Slayer's Hanneman Contracts Acute Infection; Band To Bring In Guest Guitarist””Cannibal Corpse's Pat O'Brien Will Step In As Slayer's Guest Guitarist”originalet”Slayer’s Jeff Hanneman Dead at 49””Dave Lombardo Says He Made Only $67,000 In 2011 While Touring With Slayer””Slayer: We Do Not Agree With Dave Lombardo's Substance Or Timeline Of Events””Slayer Welcomes Drummer Paul Bostaph Back To The Fold””Slayer Hope to Unveil Never-Before-Heard Jeff Hanneman Material on Next Album””Slayer Debut New Song 'Implode' During Surprise Golden Gods Appearance””Release group Repentless by Slayer””Repentless - Slayer - Credits””Slayer””Metal Storm Awards 2015””Slayer - to release comic book "Repentless #1"””Slayer To Release 'Repentless' 6.66" Vinyl Box Set””BREAKING NEWS: Slayer Announce Farewell Tour””Slayer Recruit Lamb of God, Anthrax, Behemoth + Testament for Final Tour””Slayer lägger ner efter 37 år””Slayer Announces Second North American Leg Of 'Final' Tour””Final World Tour””Slayer Announces Final European Tour With Lamb of God, Anthrax And Obituary””Slayer To Tour Europe With Lamb of God, Anthrax And Obituary””Slayer To Play 'Last French Show Ever' At Next Year's Hellfst””Slayer's Final World Tour Will Extend Into 2019””Death Angel's Rob Cavestany On Slayer's 'Farewell' Tour: 'Some Of Us Could See This Coming'””Testament Has No Plans To Retire Anytime Soon, Says Chuck Billy””Anthrax's Scott Ian On Slayer's 'Farewell' Tour Plans: 'I Was Surprised And I Wasn't Surprised'””Slayer””Slayer's Morbid Schlock””Review/Rock; For Slayer, the Mania Is the Message””Slayer - Biography””Slayer - Reign In Blood”originalet”Dave Lombardo””An exclusive oral history of Slayer”originalet”Exclusive! Interview With Slayer Guitarist Jeff Hanneman”originalet”Thinking Out Loud: Slayer's Kerry King on hair metal, Satan and being polite””Slayer Lyrics””Slayer - Biography””Most influential artists for extreme metal music””Slayer - Reign in Blood””Slayer guitarist Jeff Hanneman dies aged 49””Slatanic Slaughter: A Tribute to Slayer””Gateway to Hell: A Tribute to Slayer””Covered In Blood””Slayer: The Origins of Thrash in San Francisco, CA.””Why They Rule - #6 Slayer”originalet”Guitar World's 100 Greatest Heavy Metal Guitarists Of All Time”originalet”The fans have spoken: Slayer comes out on top in readers' polls”originalet”Tribute to Jeff Hanneman (1964-2013)””Lamb Of God Frontman: We Sound Like A Slayer Rip-Off””BEHEMOTH Frontman Pays Tribute To SLAYER's JEFF HANNEMAN””Slayer, Hatebreed Doing Double Duty On This Year's Ozzfest””System of a Down””Lacuna Coil’s Andrea Ferro Talks Influences, Skateboarding, Band Origins + More””Slayer - Reign in Blood””Into The Lungs of Hell””Slayer rules - en utställning om fans””Slayer and Their Fans Slashed Through a No-Holds-Barred Night at Gas Monkey””Home””Slayer””Gold & Platinum - The Big 4 Live from Sofia, Bulgaria””Exclusive! Interview With Slayer Guitarist Kerry King””2008-02-23: Wiltern, Los Angeles, CA, USA””Slayer's Kerry King To Perform With Megadeth Tonight! - Oct. 21, 2010”originalet”Dave Lombardo - Biography”Slayer Case DismissedArkiveradUltimate Classic Rock: Slayer guitarist Jeff Hanneman dead at 49.”Slayer: "We could never do any thing like Some Kind Of Monster..."””Cannibal Corpse'S Pat O'Brien Will Step In As Slayer'S Guest Guitarist | The Official Slayer Site”originalet”Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Kerrang! Awards 2006 Blog: Kerrang! Hall Of Fame””Kerrang! Awards 2013: Kerrang! Legend”originalet”Metallica, Slayer, Iron Maien Among Winners At Metal Hammer Awards””Metal Hammer Golden Gods Awards””Bullet For My Valentine Booed At Metal Hammer Golden Gods Awards””Metal Storm Awards 2006””Metal Storm Awards 2015””Slayer's Concert History””Slayer - Relationships””Slayer - Releases”Slayers officiella webbplatsSlayer på MusicBrainzOfficiell webbplatsSlayerSlayerr1373445760000 0001 1540 47353068615-5086262726cb13906545x(data)6033143kn20030215029