8.1 Memory Considerations

The most pressing restriction when using more than one SICStus run-time in a process is that (on 32bit machines) all these run-times must compete for the the address-constrained range of virtual memory, typically the lower 256MB of memory.

This is worsened by the fact that, on some platforms, each SICStus run-time will attempt to grow its memory area as needed, leading to fragmentation. A fix that removes the restriction on useable memory is planned for a later release.

One way to avoid the fragmentation issue to some extent is to make each SICStus run-time preallocate a large enough memory area so it will not have to grow during run-time. This can be effected by setting the environment variables GLOBALSTKSIZE, PROLOGINITSIZE and PROLOGMAXSIZE.

On some platforms, currently Linux and Windows, the default bottom memory manager layer will pre-allocate as large a chunk of address-constrained memory as possible when the SICStus run-time is initialized. In order to use more than one run-time you therefore should set the environment variable PROLOGMAXSIZE to limit this greedy pre-allocation.

     bash> GLOBALSTKSIZE=10MB; export GLOBALSTKSIZE;
     bash> PROLOGINITSIZE=20MB; export PROLOGINITSIZE;
     bash> PROLOGMAXSIZE=30MB; export PROLOGMAXSIZE;

You can use statistics/2 to try to determine suitable values for thes, but it is bound to be a trial-and-error process.

In Java, you can now create more than one se.sics.jasper.SICStus object. Each will correspond to a completely independent copy of the SICStus run-time. Note that a SICStus run-time is not deallocated when the corresponding SICStus object is no longer used. Thus, the best way to use multiple SICStus objects is to create them early and then re-use them as needed.

It is probably useful to create each in its own separate thread. One reason would be to gain speed on a multi-processor machine.


Send feedback on this subject.