Improve reability of GC on win64
Temtaime via Digitalmars-d
digitalmars-d at puremagic.com
Thu Mar 24 11:25:36 PDT 2016
Hi !
I have an app with large amount of math, so there's lot of arrays
with floats.
I found that sometimes my app starts to eat memory and then it
crash.
The problem i think is false pointers. For example i have a
struct with pointers and static array of floats. GC marks entire
struct as containing pointers. And when some data in the array
starts to point to valid memory region, gc won't release that
memory.
Also i build my app as 64 bit. I found that gc allocates memory
using
https://github.com/D-Programming-Language/druntime/blob/1f957372e5dadb92ab1d621d68232dbf8a2dbccf/src/gc/os.d#L64
And all the addresses if i print them are below 4G. So only low
32 bits of 64 bit address are used.
One can give preferred address to VirtualAlloc and make it > 4G.
I changed implementation of os_mem_map to something like:
ulong addr = 1 << 40;
while(true) {
if(auto p = VirtualAlloc(cast(void *)addr, nbytes, MEM_RESERVE |
MEM_COMMIT,
PAGE_READWRITE)) return p;
addr += nbytes;
}
And my problem with growing memory had gone.
I think we should alter implementation of os_mem_map to allocate
using addresses > 4G, so high bits won't be zeros and it'll help
with false pointer.
I think we should use some random function here. Maybe rdtsc ? Or
maybe there's other opinions ?
Thanks.
More information about the Digitalmars-d
mailing list