Я вот всё же очень интересуюсь, как можно совместить эти две вещи.
Вот придумал я такой способ, основанный на «зеркалировании»: делаем два алгоритмически идентичных процесса, которые запускаются одновременно с одними и теми же начальными условиями. Один процесс ведущий, другой - ведомый. Имеется журнал IO, в который заносятся все вызовы, относящиеся к внешнему миру (обращение к таймеру, sleep, случайные числа, ввод-вывод), и результаты, которые получены из внешнего мира. Соответственно, ведущий процесс делает эти вызовы и журнализирует их. Ведомый процесс не делает вызовов, он вместо этого обращается к журналу, откуда берёт результат вызова. Через короткое время в ведомом процессе принудительно запускается сборка мусора. После сборки мусора ведомый процесс «догоняет» ведущий, идя по журналу функций внешнего мира, после чего они меняются местами. Теперь в новом ведомом процессе запускается сборка мусора, потом он «догоняет» ведущий, потом они меняются местами и т.п.
Сами журналы вызовов не должны подчиняться сборки мусора. Сборка мусора в одном процессе не должна останавливать другой.
Так, заплатив памятью и процессорной скоростью, можно сделать выполнение программы плавным.
Но это - лишь моя затея. А как это делается на самом деле? Я порефлексировал некоторое время и пришёл к выводу, что не получится собирать мусор, совсем не останавливая программу. Может, я не прав?