Memory Management in D: Request for Comment

Jason House jason.james.house at gmail.com
Tue Nov 3 05:03:49 PST 2009


Please add weak references! I can email you a druntime compatible implementation.

dsimcha Wrote:

> During my occasional forays into the dark side of Python and Java, I am often
> amazed at the extent to which memory management in these languages "just
> works".  D should be like this for all but the most low-level programming
> tasks, and was intended to be.  It seems like most of the other regulars here
> have carved out niches that don't involve improving memory management.
> 
> My attempts at adding precise heap scanning to the GC got me thinking about
> other ways to improve memory management in D.  I love most aspects of D, but
> the constant memory management issues make it feel like much less of a
> high-level language than it should feel like.  I'm thinking of making this my
> niche around here, as I already know more about the problem than I ever wanted
> to know and I'm sick of having memory management not work properly.  Here are
> some things that I'd like comments on:
> 
> 1.  In the Hans Boehm GC, they use a blacklisting scheme whereby they avoid
> allocating memory pages that currently have false pointers pointing into them.
>  (If a page is not allocated but looks like it has a pointer into it, then we
> can assume this is a false pointer.)  If I dip into the GC code again and
> implement something like this, we'll be one step closer to making D memory
> management "just work" and making false pointers a thing of the past.
> 
> 2.  I've mentioned this a few times here before, but I wrote a second
> stack-based memory allocator called TempAlloc, which allows stack-based memory
> allocation that is not necessarily bound to function calls and automatically
> falls back on heap allocation for very large objects, rather than killing your
> program with a "stack overflow" error message.  I've also written some
> implementations of common data structures (so far arrays, hash tables and
> sets; I'll probably add binary trees at some point) that are optimized for it.
>  (see http://svn.dsource.org/projects/dstats/docs/alloc.html).
> 
> The biggest problem with TempAlloc is that it is not scanned by the GC,
> meaning that you can't store heap-allocated data in it unless you have another
> reference somewhere else.  I don't know how to remedy this, partly because the
> stacks are thread-local and I don't know how to remove a range from the GC
> upon a thread terminating, even if I hack the GC to give it the features it
> needs to properly scan TempAlloc.  Advice would be appreciated.
> 
> Other than GC scanning, is there anything else you would like to see added to
> TempAlloc?  Do you think it's general enough to be included in core.memory, or
> is it too niche?
> 
> 3.  This one is an order of magnitude less likely than the other two to
> actually get implemented, at least by me, but how about thread-local
> allocators so you can call malloc() without taking a lock?  I vaguely remember
> Sean saying he was working on that a while back, but I never heard anything
> about it again.  It's probably best to wait for shared to be implemented for
> this so that unshared objects can also be collected w/o stopping the world,
> but we should start at least discussing this now.
> 
> 
> 4.  I submitted a patch a while back to allow the GC to ignore interior
> pointers for specific objects.
> (http://d.puremagic.com/issues/show_bug.cgi?id=2927)  This would be useful if
> you have, for example, a large array that never escapes a class and the class
> always maintains a pointer to the head of the array as long as it's alive.
> This way, when the class dies, the array dies too even if there are false
> pointers to its interior.  Few people have commented on this.  Is there any
> reason why it's not a good idea?  Yes, it's somewhat unsafe if you're not
> careful, but when the alternative is horrible memory leaks, sometimes
> unsafeness is a necessary evil.




More information about the Digitalmars-d mailing list