Обычный аргумент производительности работает так:
Поколения GC быстры, потому что полагаются на эвристику, согласно которой многие выделенные объекты являются недолговечными (объект «жив», пока он достижим; цель GC - обнаруживать «мертвые» объекты и возвращать их объем памяти). Это означает, что объекты могут накапливаться в специальной области («молодое поколение»); GC запускается, когда эта область заполнена, и очищает живые объекты, перемещая их («физически») в старое поколение. В большинстве поколений GC эта операция подразумевает паузу («остановка мира»), которая терпима, потому что она короткая (молодое поколение имеет ограниченный размер). Тот факт, что мир приостанавливается во время сбора данных молодого поколения, позволяет эффективно обрабатывать молодые объекты (а именно чтение или запись ссылки в полях молодого объекта представляет собой простой доступ к памяти без необходимости учитывать параллельный доступ из потока GC или инкрементная метка и развертка).
Молодое поколение с коллекцией, управляемой, как я описал выше, эффективно, потому что, когда молодое поколение собрано, большинство объектов в нем уже мертвы, поэтому они не несут дополнительных затрат. Оптимальный размер молодого поколения - это компромисс между наихудшим случаем (все молодые объекты живы, что подразумевает максимальное время паузы) и средней эффективностью (когда молодое поколение больше, больше объектов успевает умереть до того, как коллекция, которая снижает среднюю стоимость GC).
Запуск ГХ вручную аналогичен сокращению молодого поколения. Это означает, что все больше молодых объектов будут продвигаться к старому поколению, увеличивая тем самым стоимость сбора молодого поколения (нужно отбирать больше объектов) и стоимость сбора старого поколения (больше старые объекты для обработки).