The relevant paper describing weak pointers is Stretching the storage manager: weak pointers and stable names in Haskell.