[MLton] space safety for structures
Daniel C. Wang
danwang@CS.Princeton.EDU
Fri, 02 Jul 2004 22:27:32 -0400
Hmm... one should ask a real guru, but I supsect if you use CM rather than
the REPL you may get a different result. I'd swear the SML/NJ folk know
about this space leak, and I thought they had done something to solve this
... but perhaps I'm wrong..
Stephen Weeks wrote:
> To test my model, I fed the following program to SML/NJ.
>
> ------------------------------------------------------------
> structure A =
> struct
> val n = 100
> val n = Array.maxLen
> val a = Array.array (n, 13)
> val x = 0
> end
> ; (* The semicolon is important so that F and A are compiled separately. *)
> functor F () =
> struct
> val _ = print (concat ["F ", Int.toString A.x, "\n"])
> end
> structure A = struct end
> val _ = SMLofNJ.exportML "z"
> ------------------------------------------------------------
>
> As it stands, this produces a 77,696,284 byte heap. On the other
> hand, if I swap the definitions of A.n, so that that A.a is only 100
> elements, then the heap is 10,595,540 bytes. The difference between
> those sizes is is 67,100,744, which is quite close to 4 *
> Array.maxLen. So, SML/NJ is clearly keeping A.a alive, even though it
> is dead. I conjecture this is because SML/NJ represents F as a
> closure that refers to the representation of A as a tuple, not as a
> closure that refers to the individual elements of A that F uses.
>