我想开始确定我的参考的内存要求以及它们随应用程序的使用而增长。我怎么能这样做?
答案 0 :(得分:5)
有人在mailing list前一段时间问过这个问题(之前可能还有其他人,而且......)。有些人提供的实用工具有点像你想做的那样,但我仍然更喜欢我的答案:你不能用这种普遍和自动结构共享的语言来做。你如何计算你有两个指针的大型物体的大小等等。
答案 1 :(得分:4)
一般来说,这不是一件非常有用的事情:因为任何单个ref使用的数据很可能被许多其他ref共享,因为知道这些信息并不是特别有用。
此外,它将是高度JVM特定的 - 不同的JVM实现可能会为相同的Clojure结构使用不同的内存量,具体取决于他们选择如何打包数据结构和指针。例如,我相信HotSpot将对象大小填充到最接近的8个字节,但其他JVM可以做一些完全不同的事情。此外,32/64位JVM通常会为指针使用不同的大小(但不一定以明显的方式,因为一些64位JVM使用压缩指针......)
如果仍然决定这样做,最好的方法可能是递归下降ref中的数据结构并将每个子元素的估计大小相加。
平均而言,我仍然建议您关注应用程序整体消耗的内存,而不是特定的参考。
答案 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
)
就你的问题而言,无论我们是在讨论引用还是普通绑定都无关紧要。