解释VisualVM回溯

时间:2017-07-17 16:53:00

标签: clojure profiling visualvm

我在我的Mandelbrot Set资源管理器上进行CPU分析。出于某种原因,java.lang.PersistentHashMap$BitmapIndexedNode.find占用了总CPU时间的相当大的百分比。当我拍摄分析结果的快照,并获得该方法的回溯时,我得到了这个:

VisualVM Backtrace Image

我看到很多对BigDecimal操作的引用。好像BigDecimal运营商在某些时候需要在find上调用PersistentHashMap

我对回溯的解释是否正确?调用findBigDecimal操作的结果,这意味着我无能为力吗?这对他们来说似乎是一件奇怪的事情。我虽然难以深入挖掘clojure.lang.Numbers$BigDecimalOps以验证这一点。

1 个答案:

答案 0 :(得分:1)

您的解释是正确的。加法,乘法,否定,除法和其他BigDecimal操作最终会进行哈希映射查找。这些是取消引用*math-context* Var的一部分。每次在Clojure中对两个BigDecimal对象执行算术运算时都会发生这种情况。除了切换到其他数字类型之外,没有什么可以做的,比如double

clojure.core/*math-context*动态Var没有文档字符串。据我所知,它旨在持有一个java.math.MathContext对象。 MathContext对象可用于为BigDecimal操作指定精度和rounding mode。如果绑定了*math-context*,则其值将传递给Java运行时中的BigDecimal方法,如BigDecimal.add(BigDecimal augend, MathContext mc)中所示。未绑定*math-context*时,BigDecimal方法称为without passing a context

问题的堆栈跟踪的相关部分是:

...
clojure.lang.PersistentHashMap.entryAt(Object)
clojure.lang.Var.getThreadBinding()
clojure.lang.Var.deref()
clojure.lang.Numbers$BigDecimalOps.add/multiply/..
...

Clojure源代码的一些指示:

  • *math-context* Var defined
  • 执行BigDecimal addition时,
  • *math-context*被取消引用。其他操作也会发生同样的事情
  • 取消引用Var需要调用getThreadBinding
  • getThreadBinding
  • 中的哈希地图is looked up