在Clojure中,我如何知道ref总共使用了多少内存?

时间:2011-04-05 08:33:52

标签: clojure

我想开始确定我的参考的内存要求以及它们随应用程序的使用而增长。我怎么能这样做?

3 个答案:

答案 0 :(得分:5)

有人在mailing list前一段时间问过这个问题(之前可能还有其他人,而且......)。有些人提供的实用工具有点像你想做的那样,但我仍然更喜欢我的答案:你不能用这种普遍和自动结构共享的语言来做。你如何计算你有两个指针的大型物体的大小等等。

答案 1 :(得分:4)

一般来说,这不是一件非常有用的事情:因为任何单个ref使用的数据很可能被许多其他ref共享,因为知道这些信息并不是特别有用。

此外,它将是高度JVM特定的 - 不同的JVM实现可能会为相同的Clojure结构使用不同的内存量,具体取决于他们选择如何打包数据结构和指针。例如,我相信HotSpot将对象大小填充到最接近的8个字节,但其他JVM可以做一些完全不同的事情。此外,32/64位JVM通常会为指针使用不同的大小(但不一定以明显的方式,因为一些64位JVM使用压缩指针......)

如果仍然决定这样做,最好的方法可能是递归下降ref中的数据结构并将每个子元素的估计大小相加。

  • 您需要做出假设或通过实验验证每种可能的组件类型的大小/开销。不容易...请参阅this question以获取有关在JVM上估计对象大小的一些细节。如果你很幸运,你可以找到一个为你做这件事的图书馆。
  • 您还需要跟踪所有访问过的对象 - 这也有点棘手,因为您需要比较对象标识而不是相等,因此您将无法使用任何标准的hashmap /设置类型。 (对象哈希码 - >具有相同哈希码的对象集合)的哈希映射将起作用。
  • 还有一些有趣的Clojure特定角落案例需要考虑......例如你在计算数据结构上的元数据吗?

平均而言,我仍然建议您关注应用程序整体消耗的内存,而不是特定的参考。

答案 2 :(得分:3)

因为我无法在评论中执行代码:

(let [a1 large-hash-map]
     [a2 (assoc large-hash-map :foo :bar)]
   ;; now, the two 'pointers' are a1 and a2
   ;; and the data structures they point to can share
   ;; most (but not all) of their data.
   ;; making it more or less meaningless to ask
   ;; how much memory any of the bindings holds
  )

就你的问题而言,无论我们是在讨论引用还是普通绑定都无关紧要。