The foreground collections in CMS make the code very complex. The state transitions are very complex.
A STW foreground collection can pick up where a concurrent background collection left off to try to avoid a full GC. This is nice but normally it has worse performance than a full GC.
Also, to enable foreground collections the either of UseCMSCompactAtFullCollection or CMSFullGCsBeforeCompaction has to be set correctly on the command line ( CMSCollector::decide_foreground_collection_type()).
This means that foreground collections are most likely not being used a lot.
Here is some background from an email conversation with Jon Masamitsu:
"I cannot point to a particular customer but I think it was
CBOE that had CMSFullGCsBeforeCompaction
set on its command line. I talked to them about it
and they said that they considered a full GC as
a failure and if they could avoid it by continuing the
collection in the foreground, then they had a chance
of surviving without the full GC. Of course, the issue
is the pause time and if the collection in the foreground
took a long time to finish, then it was still a failure but
once in a while it was not.
Having said that I think that it performs very poorly
and should be fixed or removed. A collection in the
foreground takes much longer than a full GC whenever
I've seen it happen. The foreground collection should
only be done if CMS is currently sweeping and I
really think it will be effective if sweeping is made
So, the suggestion is to remove the support for foreground collections and instead introduce a mechanism for doing the sweeping in a STW parallel fashion if we have to. This enhancement request should focus on removing the foreground collection. After JDK-6798836 has been implemented we can add the feature to do STW parallel sweeping.