对于周四在湾区 Clojure 聚会上的演讲,我正在编制一份在 Clojure 中泄漏内存的方法列表。
到目前为止,我有:
- 抓住无限序列的头部
- 通过在循环中调用 lambda 创建许多泛型类(这仍然是一个问题)
- 持有对未使用数据的引用
- ...
还有什么?
对于周四在湾区 Clojure 聚会上的演讲,我正在编制一份在 Clojure 中泄漏内存的方法列表。
到目前为止,我有:
还有什么?
通过在大型集合上保留对 seq 的引用。例如:
(drop 999990 (vec (range 1000000)))
返回包含对整个向量的引用的十个元素的序列!
还有实习生电话。
请注意,您的示例并没有按照这个词的常识泄漏内存。您仍然可以访问这些对象(不确定类——我假设可以通过一些 API 重新找到它们),即它们没有丢失。对于某些东西,比如类和实习字符串,忘记数据是不可能的,所以效果是一样的。
Clojure 内存泄漏通常与 Java 内存泄漏非常相似。然而,集合是“持久的”这一事实意味着,如果您将某些内容添加到集合中并且没有意识到您保留了对旧版本集合的引用以及新值,则意味着内存被消耗以保留旧版本版本悬而未决。