Существует один не совсем экспериментальный алгоритм сборки мусора, который фактически соответствует всем вашим требованиям: простой автоматический пересчет. В целом, пересчет действительно не дает достаточного кредита как жизнеспособный вариант, но на самом деле он работает очень хорошо во многих ситуациях, никогда не бывает больших задержек в партиях, и нет необходимости в сложной магии.
Одной из проблем по-прежнему является очистка циклических ссылок, которые вы, по крайней мере, можете оставить крайне редко; Разработчики приложений, которые заботятся о скорости, могут просто явно разрывать циклы, когда им нужно, чтобы объекты исчезли.
Мало ценимая особенность пересчёта заключается в том, что он гораздо более дружественен к кешу, чем другие формы сборки мусора. Если вы запускаете цикл, который каждый раз выделяет небольшие временные объекты через цикл, GC повторного монтирования (или, конечно, явное управление памятью) может повторно использовать одну и ту же память каждый раз, избегая ненужных очисток кэша. Любой другой тип GC только периодически освобождает объекты, что приводит к гораздо большей нагрузке на память и, следовательно, к замедлению.
Пересчет не очень эффективен для многопоточных систем, потому что вам нужно получать блокировки каждый раз, когда вы прикасаетесь к счету. Но если вы все равно разрабатываете новый язык, есть одна огромная вещь, которую вы можете сделать для повышения производительности и надежности всего вашего языка: предотвратить почти все объекты, которые будут совместно использоваться потоками. то есть. сделать обмен явным. Если вы сделаете это, вы узнаете, какие объекты являются против, не являются общими, и, следовательно, какие из них должны быть заблокированы при увеличении / уменьшении ссылки, а какие могут быть оставлены разблокированными. Когда нет блокировки, производительность пересчета может быть действительно отличной.