编译引用未加载(或未初始化)的类的函数时会触发其初始化静态方法。当初始化静态方法加载Clojure代码时,某些常量(我认为是源代码)会泄漏到正在编译的函数的常量池中。
由于生成的函数的静态初始化方法超过64K,这阻止了CCW在某些环境(例如Rational)中工作。
重现步骤
加载leak.main命名空间并运行以下注释中的代码:第一个函数虽然与第二个完全相同,但有15个额外的字段。
`
(ns leak.main)
(defn first-to-load []
leak.Klass/foo)
(defn second-to-load []
leak.Klass/foo)
(comment
=> (map (comp count #(.getFields %) class) [first-to-load second-to-load])
(16 1)
)
`
`
包 leak;
导入 clojure.lang.IFn;
导入 clojure.lang.RT;
导入 clojure.lang.Symbol;
公共类 Klass {
静态 {
RT.var("clojure.core", "require").invoke(Symbol.intern("leak.leaky"));
}
public static IFn foo = RT.var("leak.leaky", "foo");
}
`
`
(ns leak.leaky)
(defn foo
"Some doc"
[]
"hello")
(def unrelated 42)
`
https://gist.github.com/cgrand/5dcb6fe5b269aecc6a5b#file-main-clj-L10
补丁: clj-1620-v5.patch