当实现精确垃圾回收时,总是需要解决如何确定堆栈上的哪些单词是指针,哪些是其他类型的数据,例如整数或浮点数的问题。解释性语言通常通过将所有内容都设为指针来解决这个问题;而对于一些语言(例如Lisp),编译器则通常使用标记位来区分指针和整数。但对于支持完全未装箱机器字长整数和浮点数的Java和C#等语言的JIT编译器,它们如何知道堆栈和CPU寄存器中的哪些内容是指针呢?
第三种选择是使用一个影子栈(shadow stack),其中包含指向真实栈上的栈根(stack roots)的指针链表。详细内容请参见Fergus Henderson的论文《在不合作的环境中进行准确的垃圾收集》(PDF)。