|
Archives
D Programming
DD.gnu digitalmars.D digitalmars.D.bugs digitalmars.D.dtl digitalmars.D.ide digitalmars.D.dwt digitalmars.D.announce digitalmars.D.learn digitalmars.D.debugger C/C++ Programming
c++c++.announce c++.atl c++.beta c++.chat c++.command-line c++.dos c++.dos.16-bits c++.dos.32-bits c++.idde c++.mfc c++.rtl c++.stl c++.stl.hp c++.stl.port c++.stl.sgi c++.stlsoft c++.windows c++.windows.16-bits c++.windows.32-bits c++.wxwindows digitalmars.empire digitalmars.DMDScript electronics |
digitalmars.D.learn - Wrestling the Garbage Collector.. And loosing..
Hi. I'm having a problem with my application using extremly much memory, and the only way I'm able to free it is by deleting objects explicitly. I guess I'm not understanding the GC right, but I thought that it should free all objects without references to it when it's collecting, but my testing below shows I'm doing something wrong. // Test 1 auto str = new char[512]; delete str; str = new char[512]; // OK. No new allocation // Test 2 auto str = new char[512]; str = new char[512]; // New memory allocated. GC isn't run. Guess it's expected behavior. // Test 3 auto str = new char[512]; str = null; str = new char[512]; // New memory allocated. GC isn't run. Guess it's expected behavior. // Test 4 auto str = new char[512]; str = null; GC.collect; str = new char[512]; // New memory allocated. Why? // Test 5 auto str = new char[512]; str.length = 0; GC.collect; str = new char[512]; // New memory allocated. Why? I would have thought Test 4 and 5 shouldn't allocate more memory either as I remove the reference (or zero length) and run the GC, but it does. I would also think Test 2 and 3 should make the GC reclaim memory when it is run. The same applies for classes too, but there I need to explicitly delete all members in the destructor also.. And what does GC.minimize actually do? Even if I free an object and run minimize, the application still uses the same amout of memory (or at least it looks like it) This is tested with dmd 1.028, tango ca. 0.99.5 (used trunk from back then) and win xp. At this point my program is basically useless because of this. You can run it and restart it before the next run, but this limits its use very much. I can fix it by explicity deleting objects when I don't need them, but I really hope I don't have to. I'm already using scope everywhere I can, and my tests with those shows it helps a lot, but the application will still require a good deal of memory and I need to limit this as much as I can. I really hope someone could enlighten me on the correct usage of the GC (I've read the garbage collector documentation and memory article on digitalmars and the wikipedia article without getting much smarter) Apr 30 2008
"Simen Haugen" wroteHi. I'm having a problem with my application using extremly much memory, and the only way I'm able to free it is by deleting objects explicitly. I guess I'm not understanding the GC right, but I thought that it should free all objects without references to it when it's collecting, but my testing below shows I'm doing something wrong. // Test 1 auto str = new char[512]; delete str; str = new char[512]; // OK. No new allocation // Test 2 auto str = new char[512]; str = new char[512]; // New memory allocated. GC isn't run. Guess it's expected behavior. // Test 3 auto str = new char[512]; str = null; str = new char[512]; // New memory allocated. GC isn't run. Guess it's expected behavior. // Test 4 auto str = new char[512]; str = null; GC.collect; str = new char[512]; // New memory allocated. Why? // Test 5 auto str = new char[512]; str.length = 0; GC.collect; str = new char[512]; // New memory allocated. Why? I would have thought Test 4 and 5 shouldn't allocate more memory either as I remove the reference (or zero length) and run the GC, but it does. I would also think Test 2 and 3 should make the GC reclaim memory when it is run. Apr 30 2008
|