In the default collector policy we stop adding old gen regions to the collection set when the waste threshold is reached.
This can cause rather short mixed gcs that do not reclaim a lot, if anything. Since getting to a safepoint can take a considerable amount of time, this looks like a waste of throughput.
Either lift this restriction, or size the young gen more appropriately to avoid wasting a lot of throughput.
E.g.
g1DefaultPolicy.cpp:351ff:
if (reclaimable_perc <= threshold) {
// We've added enough old regions that the amount of uncollected
// reclaimable space is at or below the waste threshold. Stop
// adding old regions to the CSet.
log_debug(gc, ergo, cset)("Finish adding old regions to CSet (reclaimable percentage not over threshold). "
"old %u regions, max %u regions, reclaimable: " SIZE_FORMAT "B (%1.2f%%) threshold: " UINTX_FORMAT "%%",
old_region_length(), max_old_cset_length, reclaimable_bytes, reclaimable_perc, G1HeapWastePercent);
break;
}