Is "Out of Memory" a recoverable error?
Don
nospam at nospam.com
Tue Dec 2 05:57:49 PST 2008
Walter Bright wrote:
> I asked this over on stackoverflow.com to see what people using other
> languages have to say, as well as the D community. The reason I ask is
> to see if memory allocation can be allowed in functions marked "nothrow".
>
> http://stackoverflow.com/questions/333736/is-out-of-memory-a-recoverable-error
>
I don't think it can be recoverable. Or rather, if it is recoverable, it
shouldn't have happened in the first place.
As far as I can tell, the only thing you could do to recover from an
out-of-memory condition is (1) to free some memory, or (2) to switch to
an algorithm which doesn't need as much memory.
Strategy (1):
Windows used to have a WM_COMPACTING message (maybe it still does) which
was sent when the system was running low on memory. In D, you could
imagine a similar sort of system callback, which is called when memory
is short -- it means, free some memory now, otherwise you'll get an out
of memory error.
This is much simpler and more powerful than catching an
OutOfMemoryException, freeing some memory, and then repeating what you
were doing.
Strategy (2):
If you've got a second algorithm to use, why weren't you checking
available memory, and choosing the correct algorithm in the first place?
I don't think either of these strategies make sense. The technique of
catching exceptions works because you have locality of reference of
almost all resources. If you get a FileException, the bit of code which
deals with that particular file is small, and you can unroll the call
stack to get past it. But memory usage is a whole-program thing. The
biggest unnecessary memory allocation might be a completely unrelated
part of the program.
More information about the Digitalmars-d
mailing list