On Tuesday, 6 November 2012 at 11:27:25 UTC, luka8088 wrote:
Hello everyone,

I was writing some unit tests and I also wanted to test that in certain cases object references are properly removed everywhere so that GC can collect them in order to make sure there is no memory leak. While trying to achieve this I learned that objects are not always collected at the time I would expect them to, so I documented current behavior and some tips.

Those are some sample cases which all fit into the general rule: on collection the stack is scanned and everything that looks like a pointer to live heap is used to mark heap objects as live, then the heap objects are scanned and marked transitively. Unmarked objects get collected. In each case described in the original post the decision whether some value will be collected or not depends on whether the local variable is still on the stack and not overwritten by some newer stack variable. As a consequence:
If it's going to be used later, it's still live on stack.
If it's not going to be used later, it all depends on whether some other variable defined later is placed by compiler in the same stack slot, and whether that new variable was initialized already. If it was used in a function called and returned, it's not in the active stack, so it should be collected. And so on.

Reply via email to