how is memory allocated
John M McIntosh
johnmci at smalltalkconsulting.com
Wed Oct 6 17:34:14 UTC 2004
The os-x carbon VM calls
mmap( NULL, gMaxHeapSize, PROT_READ | PROT_WRITE, MAP_ANON |
where gMaxHeapSize is 512MB.
Then a small chunk of memory (image size plus slack plus freehead room)
is allocated out of this by some logic that ensures a full GC is done
before more memory is grabbed out of this reserved space. Once free
space goes over a certain limit, the total used memory is decreased,
this is set from the image. The grow/shrink values and logic. If you
use Apple's activity monitor you'll see that Squeak has 735MB of
virtual memory, but only using 27MB of Real Memory.
For os9 9.2.x we invoke
OpenMappedScratchFile & MapFileView for 128MB (unless the application
memory size is > 128MB) then fallback to Newptr
if the operating system (OS7.5.5-OS9.0.0) does not support MapFileView.
For unix if mmap is supported then it does
#define MAP_PROT (PROT_READ | PROT_WRITE)
#define MAP_FLAGS (MAP_ANON | MAP_PRIVATE)
mmap(0, heapLimit, MAP_PROT, MAP_FLAGS, devZero, 0)
and I believe it targets 1GB.
or a malloc() if mmap is not supported.
Again all the rules for grow/shrink apply, as mentioned the values can
be changed in the image
Smalltalk vmParameterAt: 25 put: 4*1024*1024. "grow headroom"
Smalltalk vmParameterAt: 24 put: 8*1024*1024. "shrink threshold"
which dictates 4MB mostly free, when we run out of memory grow in
increments to the max size. When we exceed 8MB free , shrink to about
Which implies for your 20MB image it would allocate about 24MB of real.
The maximum amount of virtual memory can be changed in the carbon os-x
version and via command line in the unix version to limit the virtual
memory allocated (perhaps depends on OS) to back the usage.
Technically you could startup the linux VM and say it has a 32MB max,
now the issue (maybe) is that I'd suspect you need 30ish MB of virtual
memory to run a 20MB image. Because of (rare) fullGC work this
requires touching all 20MB, and depending on the random usage of
objects in your image again perhaps all 20MB is need, plus of course
the 4MB being used for New Space allocation, plus space for the virtual
machine execution logic. Shrinking your image down to 8MB would be a
better thing. Really you need to see what happens and observe what it's
doing to page in/out activity.
In general having a smalltalk image do paging is a bad thing.
On Oct 6, 2004, at 1:23 AM, Kamil Kukura wrote:
> This is rather dumb question. If I have image of size, say 20MB, is it
> loaded into the memory as one big chunk? Or is memory allocated on
> demand somehow? This concerns me because I have virtual servers with
> only 24MB RAM and they run Linux Debian with Apache with PHP and still
> have free memory.
John M. McIntosh <johnmci at smalltalkconsulting.com> 1-800-477-2659
Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com
More information about the Squeak-dev