I was writing some code and it kept crashing. Later after digging the dumps I realized I was overshooting the maximum heap limit (life would have been easier if I had added a check on malloc). Although I fixed that, is there any way to increase my heap size?
PS: A quite similar question here but the reply is unclear to me.
The heap usually is as large as the addressable virtual memory on your architecture.
You should check your systems current limits with the
ulimit -acommand and seek this line maxmemory size (kbytes, -m) 3008828, this line on my OpenSuse 11.4 x86_64 with ~3.5 GiB of ram says I have roughly 3GB of ram per process.Then you can truly test your system using this simple program to check max usable memory per process:
This programs gets memory on 100MiB increments, presents the currently allocated memory, allocates 0’s on it,then frees the memory. When the system can’t give more memory, returns NULL and it displays the final max usable amount of ram.
The Caveat is that your system will start to heavily swap memory in the final stages. Depending on your system configuration, the kernel might decide to kill some processes. I use a 100 MiB increments so there is some breathing space for some apps and the system. You should close anything that you don’t want crashing.
That being said. In my system where I’m writing this nothing crashed. And the program above reports barely the same as
ulimit -a. The difference is that it actually tested the memory and by means ofmemset()confirmed the memory was given and used.For comparison on a Ubuntu 10.04×86 VM with 256 MiB of ram and 400MiB of swap the ulimit report was
memory size (kbytes, -m) unlimitedand my little program reported 524.288.000 bytes, which is roughly the combined ram and swap, discounting ram used by others software and the kernel.Edit: As Adam Zalcman wrote,
ulimit -mis no longer honored on newer 2.6 and up linux kernels, so i stand corrected. Butulimit -vis honored. For practical results you should replace -m with -v, and look forvirtual memory (kbytes, -v) 4515440. It seems mere chance that my suse box had the -m value coinciding with what my little utility reported. You should remember that this is virtual memory assigned by the kernel, if physical ram is insufficient it will take swap space to make up for it.If you want to know how much physical ram is available without disturbing any process or the system, you can use
long total_available_ram =sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE) ;this will exclude cache and buffer memory, so this number can be far smaller than the actual available memory. OS caches can be quiet large and their eviction can give the needed extra memory, but that is handled by the kernel.