On Monday, 18 August 2014 at 18:04:50 UTC, Ali Çehreli wrote:
On 08/18/2014 03:11 AM, Ivan Kazmenko wrote:

> my program usually hit an out-of-memory error very soon.  It
> worked fine when compiled with 64-bit DMD but failed to
collect
> the garbage in time with 32-bit DMD and with recent LDC.

That sounds like a false pointer issue. D's current GC is conservative: It takes any value that could be a pointer as a pointer and persists the memory that is falsely being pointed at.

The problem becomes 2^^32 times less likely when pointers are 64-bit wide.

Hmm, that might be it, thank you for the tip.

I suppose there is a way to disable scanning certain parts of memory for possible pointers. Still, the core.memory documentation speaks a lower-level language than I'm currently familiar with. A quick look on your book's memory management chapter provided some explanation but still didn't enlighten me on this specific problem.

It looks like I want to have most of my data under something like GC.BlkAttr.NO_SCAN. But I don't yet see a clean way to introduce something like that in the code. It seems like I want a custom allocator, but various pages show they existed in D1 and are now deprecated in D2. And perhaps there is also a granularity problem: I have classes containing structs and structs pointing to classes, so struct data (single bytes to hundreds of bytes) lies next to class pointers most of the time.

So, is there a tutorial on how to better hint the D garbage collector?

Ivan Kazmenko.

Reply via email to