I was recently considering trying out the new G1 garbage collector, see if it was any better than current real time CMS garbage collector. A concurrent soft real-time garbage collector that can compact? Awesome!

I switched one of my production applications to use the new G1 garbage collector and noticed a spike in CPU and diminishing throughput almost instantaniously, what gives? I googled around and stumbled upon this blog post and decided to do my own benchmarking.

I hacked up the following scala script based off the blog post to compare the two garbage collectors. The JDK that was used was JDK7u3 on Solaris on a quad core box.

[code lang=”scala”]
val map = new java.util.LinkedHashMap[Long, String]()
var i:Long = 0
while(i < math.pow(10000, 2)) {   map.put(i, new String())   map.remove(i - 1)   i = i + 1   if (i % 10000 == 0) {     System.out.println(i)   } } [/code] CMS:
time scala -J-XX:+UseConcMarkSweepGC GC.scala
real    0m12.477s
user    0m12.364s
sys 0m0.491s
time scala -J-XX:+UseG1GC GC.scala
real    2m26.121s
user    7m33.234s
sys 0m10.888s
Just what I saw with my production application, the throughput substantially diminished and the CPU cores spiked. I won’t be using the G1 garbage collector any time soon, hopefully Oracle will improve the G1 garbage collector with subsequent releases.