The program is one that has been exported to an object and compiled to a native 
binary using polyc - the problem doesn't seem to occur when running from the 
repl directly (because of all the allocation that happens in compiling 
beforehand?) but producing a standalone binary is a goal.

So this feels like a stupid question, but can I pass runtime arguments like 
--minheap through the compiler, so that they're applied on startup by the 
binary produced by polyc? It appears that runtime-related arguments passed to 
poly are not retained in the binary produced by polyc from the dumped image.


Chris

On Fri, 2 Aug 2019, at 18:16, David Matthews wrote:
> Chris,
> I wonder if the problem is that it has checked that there is sufficient 
> space available in the heap but not that this is available as a single 
> contiguous area.  If you want to work-around the problem you can 
> probably set --minheap to, say 1G.
> 
> David
> 
> On 31/07/2019 18:53, Chris Cannam wrote:
> > I have an SML program which sometimes fails while trying to allocate an 
> > array of 3 million ints, with the message
> > 
> > Run out of store - interrupting threads
> > 
> > and an exception.
> > 
> > This happens on one of the first substantial allocations in the program, 
> > near the start of its run, so there should be space available - and it only 
> > happens on occasional runs, and if it doesn't fail, then the rest of the 
> > program (which does a lot more work) runs fine.
> > 
> > The exact size of the array being allocated doesn't seem to matter so long 
> > as it's reasonably large, but despite this and the fact that it's so early 
> > in the program, I haven't yet managed to make a simple test program with a 
> > similar allocation pattern that fails.
> > 
> > The situation seems to be the same regardless of whether I use Poly/ML 5.7, 
> > 5.8, or current git.
> > 
> > I compared a successful run with an unsuccessful one based on logging in 
> > the runtime. In both cases this allocation gets sent for a "quick GC", 
> > which returns failure, followed by a full GC, which runs and then either 
> > succeeds or fails to establish that there is enough memory available 
> > afterwards (via CheckForAllocation).
> > 
> > In the "good" case, when this check comes to AllocHeapSpace, the test "if 
> > (space->allocationSpace)" never succeeds and we fall out of the first loop 
> > with currentAllocSpace == 0, defaultSpaceSize == 131072, spaceBeforeMinorGC 
> > == 120608, and our request for minWords == 3000001 is successfully fielded 
> > in the following conditional block.
> > 
> > In the "bad" case, when this check comes to AllocHeapSpace, the "if 
> > (space->allocationSpace)" test succeeds once (available == 131070), then we 
> > fall out of the first loop with currentAllocSpace == 131072, 
> > defaultSpaceSize == 131072, spaceBeforeMinorGC == 120608, the following 
> > conditional is not entered, and we return failure from the line at the end 
> > of the function, causing the GC to return failure as well.
> > 
> > If I comment out the check
> >      if (currentAllocSpace/* + minWords */ < spaceBeforeMinorGC)
> > then it apparently always succeeds, but I can see that this is no solution 
> > because no GC is happening at all without it...
> > 
> > Any suggestions for what I might look at next?
> > 
> > 
> > Chris
> > _______________________________________________
> > polyml mailing list
> > polyml@inf.ed.ac.uk
> > http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
> > 
>
_______________________________________________
polyml mailing list
polyml@inf.ed.ac.uk
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml

Reply via email to