On Friday, 10 May 2013 at 23:18:31 UTC, maarten van damme wrote:
I'm trying to generate images and after displaying them I want
to save them
to a png file. I use parallelism to generate them
asynchronously with the
gui-thread to avoid blocking (don't know if this is really
relevant).
If I add a single line in the method where I generate the image
that
creates a class which allocates a pretty big array, slowly but
surely the
memory starts to rise until it ends in a spectacular out of
memory
exception. I always thought the garbage collector would deal
with it.
I tried reducing it but failed. Maybe I should let dustmite
bite in it a
bit later.
How can I manually fix this? Is this a known bug in the garbage
collector?
btw, this code also caused segfaults on my 64 bit laptop on
linux.
How can I avoid this?
main class:
https://dl.dropboxusercontent.com/u/15024434/picturegenerator/generalised.d
zip file with everything ready to go to compile:
https://dl.dropboxusercontent.com/u/15024434/picturegenerator/picturegenerator.zip
1) your code is not compilable on 64x system due to erroneous
treating of some platform-varying types as uint, use size_t.
Luckily dmd has -m32 switch
2) I encounter not out of memory exception but enforcement
failure in simpledisplay.d:1024 "Maximum number of clients" which
looks like not a memory error but you running out of some X
server limit.
3) Segfault occures in simpledisplay.d:1058 - in destructor you
call XDestroyImage(handle) but do not check whether handle is
null. However it happens after enforcement failure so it doesn't
looks like root of problem.
4) What really consumes memory is kernel or something which
forces it to consume it since my task manager reports two blocks
of 280 MB and 126 MB inside kernel part of virtual memory.