В языках с автоматической сборкой мусора, например Haskell или Go, как сборщик мусора может узнать, какие значения хранятся в стеке, являются указателями на память и которые являются просто цифрами? Если сборщик мусора просто сканирует стек и предполагает, что все адреса будут ссылками на объекты, многие объекты могут быть неправильно отмечены как достижимые.
Очевидно, что можно добавить значение в начало каждого стека стека, в котором описано, сколько из следующих значений являются указателями, но это не стоило бы большой производительности?
Как это делается на самом деле?