Из-за Generational Collection я бы сказал, что трассировка и копирование не огромные узкие места для GC.
Что может помочь, так это аппаратные барьеры READ, которые устраняют необходимость в паузах «остановка мира» при сканировании стека и разметке кучи.
Azul Systems сделала это: http://www.azulsystems.com/products/compute_appliance.htm
Они выступили с докладом на JavaOne о том, как их аппаратные модификации позволили сделать абсолютно безостановочный сборщик мусора.
Еще одним улучшением стали бы аппаратные барьеры записи для отслеживания запомненных наборов.
Поколения GC, и тем более для G1 или Garbage First, уменьшают объем кучи, которую они должны сканировать, только сканируя раздел и сохраняя список запомненных наборов для указателей между разделами.
Проблема в том, что это означает, что ЛЮБОЕ время, когда мутатор (причудливое слово для «настоящей программы») устанавливает указатель, он также должен поместить запись в соответствующий запоминаемый набор. Таким образом, у вас есть (небольшие) накладные расходы, даже если вы не GCing. Если вы можете уменьшить это, вы уменьшите как время паузы, необходимое для GCing, так и общую производительность программы.