digitalmars.D - GC behavior
- Gregor =?UTF-8?B?TcO8Y2ts?= (18/18) Jun 07 2019 Hi!
- KnightMare (5/5) Jun 07 2019 I also noticed:
- KnightMare (3/3) Jun 07 2019 Windows Server 2019 (x64)
- Gregor =?UTF-8?B?TcO8Y2ts?= (7/12) Jun 07 2019 Thanks for reproducing! So it's a dmd bug then.
- KnightMare (2/2) Jun 07 2019 I filled issue https://issues.dlang.org/show_bug.cgi?id=19947
- Gregor =?UTF-8?B?TcO8Y2ts?= (2/4) Jun 08 2019 Thanks for reporting! I'll monitor the bug there.
- KnightMare (4/4) Jun 07 2019 and yes, LDC drops all code in main, coz u dont use
- Gregor =?UTF-8?B?TcO8Y2ts?= (25/43) Jun 07 2019 It's a bit stranger than that: the following program doesn't fail
Hi! I'm not 100% sure if I'm in the right here, but I believe that the following program shouldn't have unbounded heap growth to the point where it runs out of memory: module gctest; import core.memory; import core.thread; void main() { for(int i = 0; i < 10000; i++) { int[] x = new int[10000000]; Thread.sleep(dur!"msecs"(200)); //GC.collect(); // keeps program from failing } } If GC.collect() is called constantly, heap size stays pretty much constant. Tested only on Windows 10 (64 bit) with DMD 2.086.0 so far. I'd say that this behavior is a bug.
Jun 07 2019
I also noticed: where code with arrays allocations compiled by LDC work ok, code by DMD is failed. "gc:precise" doesn't help (maybe false positives scans.. dunno). this code by DMD crashes for me at -m32 only
Jun 07 2019
Windows Server 2019 (x64) DMD 2.086.0 LDC 1.16.0-beta2
Jun 07 2019
On Friday, 7 June 2019 at 14:24:23 UTC, KnightMare wrote:I also noticed: where code with arrays allocations compiled by LDC work ok, code by DMD is failed. "gc:precise" doesn't help (maybe false positives scans.. dunno). this code by DMD crashes for me at -m32 onlyThanks for reproducing! So it's a dmd bug then. DMD automatically generates a 32 bit executable for me, so my tests are hitting the 4GB boundary long before physical memory availability becomes an issue. GC.collect() does collect the arrays, so I don't think that false positives during the scan shouldn't be the issue.
Jun 07 2019
I filled issue https://issues.dlang.org/show_bug.cgi?id=19947 add something if u want (maybe link to this topic)
Jun 07 2019
On Friday, 7 June 2019 at 14:47:44 UTC, KnightMare wrote:I filled issue https://issues.dlang.org/show_bug.cgi?id=19947 add something if u want (maybe link to this topic)Thanks for reporting! I'll monitor the bug there.
Jun 08 2019
and yes, LDC drops all code in main, coz u dont use arrays/results and alloc int[] do nothing too (no constructors with some logic) so, I checked with sum(array) and printing result (=0)
Jun 07 2019
On Friday, 7 June 2019 at 12:28:50 UTC, Gregor Mückl wrote:Hi! I'm not 100% sure if I'm in the right here, but I believe that the following program shouldn't have unbounded heap growth to the point where it runs out of memory: module gctest; import core.memory; import core.thread; void main() { for(int i = 0; i < 10000; i++) { int[] x = new int[10000000]; Thread.sleep(dur!"msecs"(200)); //GC.collect(); // keeps program from failing } } If GC.collect() is called constantly, heap size stays pretty much constant. Tested only on Windows 10 (64 bit) with DMD 2.086.0 so far. I'd say that this behavior is a bug.It's a bit stranger than that: the following program doesn't fail only because it has the writeln with the string concatenation in it. I discovered it by accident while trying to look into how Windows reports available memory to 32 bit programs. module gctest; import core.thread; import std.conv; import std.stdio; void main() { for(int i = 0; i < 10000; i++) { int[] x = new int[10000000]; Thread.sleep(dur!"msecs"(200)); writeln("allocation " ~ to!string(i)); } } Just the writeln without any concatenation will still not trigger garbage collection runs. What is it about the ~ operator implementation that changes the behavior so drastically? As a side note, I don't think that GlobalMemoryStatus on Windows works the way the GC code thinks it's working. It will always happily report 2^31 bytes total and available memory, no matter how big the heap of the 32 bit program is. So isLowOnMem in gc/os.d should actually be broken in this particular situation.
Jun 07 2019