如果在运行时替换函数,Clojure/JVM GC 会旧代码吗?

Max*_*axB 3 garbage-collection jvm clojure

如果您在运行时频繁替换函数,就像这张海报为了的目的而想要做的那样,Clojure/JVM GC 会不会是旧代码?

Ala*_*son 5

如有疑问,请询问计算机!我写了一个快速测试:

(ns tst.demo.core
  (:use demo.core tupelo.core tupelo.test))
  
(defn create-fn
  [n]
  (let [fname   (symbol (format "add-%d" n))
        body    (vector '[x] (list '+ n 'x))
        fn-form (apply list 'clojure.core/defn fname body)
        fn-ref  (eval fn-form)]
    fn-ref))

(defn create-and-call-fn
  [n]
  (let [fn-ref (create-fn n)
        fn-result (fn-ref 3)]
    (when-not (= (+ 3 n) fn-result)
      (throw (ex-info "bad result" (vals->map n fn-result))))))


(dotest
  (let [f5 (create-fn 5)
        f5-result (f5 3)]
    (is= 8 f5-result))
  (dotimes [i 99999]
    (when (zero? (mod i 100)) (spyx i))
    (create-and-call-fn i)))
Run Code Online (Sandbox Code Playgroud)

之后创建多达 10 万个函数,它仍然有效。天啊!


以上是基于这个模板项目

  • @generateme 但是当你“eval”一个函数时,你会生成一个新类,而不仅仅是一个新对象。该类是否被清理并不像某些随机 lambda 是否被清理那么明显。 (2认同)