我的 clojure 应用程序评估单独定义的代码.edn
文件在运行时,即如果.edn
文件更改后,所包含的函数定义将重新加载到原子中,该原子不断用于计算。
如果不受限制的话,应用程序似乎会在一段时间后填满 JVM 的元空间(无限制)。堆空间使用情况正常。
我使用“YourKit”分析器来追踪泄漏。似乎大多数分配,包括分析器显示“无法从垃圾收集器根访问”的分配,都来自eval
call:
(defn eval-edn [e params_ dynparams_]
(let [input e
pairs (seq input)]
(binding [*ns* (find-ns 'myapp.core)
moods (:moods input)
last-moods @state/moods-atom
effects (:effects input)
last-effects @state/effects-atom
params params_
dynparams dynparams_
param-stats @state/coreparam-stats]
(eval input))))
Where params
and dynparams
是动态变量。
The .edn
文件看起来像这样:
{:moods {:happiness
(* (:happiness:factor dynparams)
(* 0.5 (Math/sin (* (/ (- (:weather:temperature params 0) 10) 30)
Math/PI))))
; ...
}}
具体来说,内存快照将显示数千个类型的对象myapp.core$evalN.invoke()
, where N
每个新调用都会增加一些索引。
我读过eval
应该尽可能避免,但我不知道如何在没有它的情况下在运行时在 JAR 可执行文件中重新加载代码。
我怎样才能确定所有的内存使用eval
是否正确清理?
你不应该使用eval
。它不适用于您的用例。使用tools.reader
反而。
https://github.com/clojure/tools.reader https://github.com/clojure/tools.reader
详细讨论在这里:
http://www.learningclojure.com/2013/02/clojures-reader-is-unsafe.html?m=1 http://www.learningclojure.com/2013/02/clojures-reader-is-unsafe.html?m=1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)