Specifying heaps when rebuilding images

We recommend that all users regularly update their Allegro CL distributions. This is done by downloading patches, as described in Patches in Introduction.htm. The last step in getting and applying patches is rebuilding images. Rebuilding is done with the update.exe (Windows)/update.sh (UNIX) program included in the Allegro directory (see What to do with patches when you have downloaded them, also in Introduction.htm).

A limitation of the update program is that is does not allow for arguments specifying desired features of the images it builds. This is not particularly important in general since most relevant arguments default to the value used in the image being rebuilt. But it is important for heap locations and sizes, and for initial newspace and oldspace size. These values are not inherited from the image being rebuilt.

Those values, particularly the heap sizes and start locations, can be very important: the Allegro CL Lisp heap can grow very large (up to about 2 Gb on 32-machine and much larger on 64-bit machines). But if they attempt to grow but find the Operating System has mapped something in a blocking location, the growth attempt will fail and (typically) a Storage Condition error will be signaled, perhaps similar to the following:

  Error: An allocation request for 112164 bytes caused tenuring and a need
  for 22544384 more bytes of heap. The operating system will not make
  the space available because the address space reserved for the heap
  could not be increased.  [condition type: STORAGE-CONDITION]

There are four values which control the Lisp and aclmalloc heaps: Lisp heap Start, Lisp Heap Size, aclmalloc Heap Start, and aclmalloc Heap Size. These are controlled by the :lisp-heap-start, :lisp-heap-size, :aclmalloc-heap-start, and :aclmalloc-heap-size arguments to build-lisp-image.

The two -start arguments (:lisp-heap-start and :aclmalloc-heap-start) are the most important. Both heaps will grow beyond their initial sizes if necessary (and if possible). And both heaps have to be contiguous (they cannot be fragmented into several pieces). Suppose you need a Lisp heap of 1.2 Gb. Then, the default values for a 32-bit image (Lisp heap start at #x20000000 and aclmalloc heap start at #x54000000) will not do, because (- #x54000000 #x20000000) is 872415232, or 832 Mb. You need to have the aclmalloc heap start at #x4b000000 at least. (The #x prefix means a hexadecimal number follows. You can evaluate these at a Lisp prompt to get the decimal equivalents.)

Also, you might have discovered that the OS is mapping something (such as a library) between the Lisp heap start and the aclmalloc heap start, say from #x30000000 to #x30200000. That object will prevent the Lisp heap from growing past #x30000000 (which, with the start at #x20000000, restricts the Lisp heap to 272 Mb). In that case (assuming there are no other blockages, you might want to start the Lisp heap at #x30200000 and push the aclmalloc heap start from #x54000000 to #x64000000.

You can build individual images using these locations very easily with build-lisp-image. But you may want images build by the update program to use the same values. You can do this by specifying values for the following environment variables:

Argument Associated Environment Variable
:aclmalloc-heap-size ACL_BUILD_ACLMALLOC_HEAP_SIZE
:aclmalloc-heap-start ACL_BUILD_ACLMALLOC_HEAP_START
:lisp-heap-size ACL_BUILD_LISP_HEAP_SIZE
:lisp-heap-start ACL_BUILD_LISP_HEAP_START

See building-images.htm for information on building images. The arguments discussed above are discussed in that document, particularly the sections Arguments to build-lisp-image 2: defaults not inherited from the running image and Arguments to build-lisp-image 3: defaults taken from environment variables. Patches and updating are discussed in several sections starting at in Patches in Introduction.htm. There are numerous entries in the Allegro CL FAQ on Heap Placement Issues.

Copyright © 2018 Franz Inc., All Rights Reserved | Privacy Statement Twitter Google+