Reference-Counting Collection
Reference counting does a reasonable job of providing deterministic finalization in many cases. However, it's worth noting that in quite a few cases it doesn't, the most commonly cited example being cycles. In fact, straightforward reference counting never collects objects that participate in cycles. Most of us have painfully learned manual techniques to manage this, but using these techniques is an undesirable source of bugs. Also, if you start remoting objects across apartments, you can get apartment reentrancy and thus introduce a great deal of nondeterminism in your program. Some would argue that as soon as you hand a reference to an object outside the immediate control of a tightly coupled program, you have lost your deterministic finalization because you have no idea when or if that "foreign" code will release the reference. Others believe a complex system dependent on the order of termination of a complex graph of objects is an inherently brittle design likely to create a significant maintenance problem as the code evolves.