MRI 2.2 has had some big improvements with GC since 2.1, namely incremental GC and now it garbage collects symbols.
One fellow fixed his memory leak simply by upgrading MRI, see this blog post
We switched to Rubinius a while back, and one reason was because we thought it had superior garbage collection.
It seems that Rubinius does not garbage collect symbols, see this issue. Is this still the case and is GC-ing symbols a big improvement?
I have read about concurrent GC in rubinius, which seems to address the same problem as MRI's incremental GC, i.e. removing long GC pause times. I have also seen this description of generational GC in rubinius as well. However, I don't know how to size MRI GC up against RBX GC.
So does anyone know which is superior?
It seems that Rubinius does not garbage collect symbols, see this issue. Is this still the case and is GC-ing symbols a big improvement?
Rubinius currently doesn't garbage collect Symbols. We'll add this eventually but for now there are more pressing matters to take care of (e.g. support for LLVM 3.6/MCJIT).
Whether Symbols being GC'd is going to be an improvement depends on your application. If said application is creating a lot of Symbols that are only used rarely then sure, it could save you some memory. The best way to figure this out is to measure memory usage before/after switching to a GC that collects Symbols.
So does anyone know which is superior?
Rubinius' GC aims to have less and shorter pauses (it's not 100% concurrent meaning that it does still pause everything once in a while) and aims to be precise (meaning it knows exactly what to collect instead of missing objects). Whether this results in superior garbage collection again depends on the type of application you're running.