Chris makes some points which are interesting in their own right, particularly the one comparing the amount of research which has gone into tracing/copying gc vs rc. But I think there is an unmentioned bias which is worth pointing out. Tracing gc has found massive success in enterprise java applications, which:<p>- Need to scale in terms of code size and contributor count, and therefore need the modularity afforded by tracing gc<p>- Need to scale in terms of heap size, and are therefore more likely to run into the pathological fragmentation issues that come from non-compacting gc<p>- Need the higher throughput afforded by tracing gc<p>- Generally run on massive servers that have the cores, memory size, memory speed, power budget, and heat dissipation required to support high-quality tracing gc<p>Contrariwise, swift is a product of apple, a laptop and phone company, and is used to make laptop and phone apps which:<p>- Are unlikely to ever get really huge (people balk at large downloads)<p>- May have limited memory, and need to share it with other apps<p>- Run on battery-powered hardware with little or no active cooling, and so need to attempt to conserve power<p>No silver bullet, as they say. I implement APL, which absolutely cannot do without reference counting, except perhaps in some novel configurations. I think that for the more usual case of a pointer-chasing language, tracing gc is almost certainly the right choice.<p>Lastly, however, I would be remiss not to bring up bacon et al, 'A Unified Theory of Garbage Collection'[0], which notes that tracing gc and reference counting are not really opposed to one another, and that a sufficiently advanced implementation of either will approach the other. Lattner mentions barriers (though as a sibling mentions, barriers are an order of magnitude cheaper than reference count twiddling); on the other side of the coin, consider deferred reference counting, one-bit reference counts, ...<p>The bottom line being that memory management is _hard_, in all cases; a sufficiently robust and general solution will end up being rather complicated no matter what it does; and, again, there is no silver bullet.<p>0. <a href="https://courses.cs.washington.edu/courses/cse590p/05au/p50-bacon.pdf" rel="nofollow">https://courses.cs.washington.edu/courses/cse590p/05au/p50-b...</a>