实现序列是内存中对象的一个链,其中的每个链接都指向一个值和下一个链接,直到最终到达一个函数对象,这是序列中剩余未实现的部分。对实现链中任何链接的引用都会导致从该点开始的其余链被强引用并无法被 gc'ed。
如果您只知道链的未实现“末端”,则您后面的所有链接都可以被收集。当您“持有头部”时,该指针指向链的开始,这阻止了从开始到未实现点的 N 个链接被保持在内存中。
例如
(def r (repeat 100000000 "abcdef")) ;; r holds a strong reference to the head
(count r)
与
(count (repeat 100000000 "abcdef"))
可以遍历 seq,使计数值后面的链接可以 gc'ed。 (注意,range
是人们常用作此类示例的东西,但它具有针对典型情况的优化 count
。)