问题 Clojure不会消耗太多的perm-gen空间吗?


我是Cojure的新手,但我读到在使用AOT编译时会为每个函数生成一个类。这是不是意味着很多消耗了perm-gen空间的类?这有什么问题吗?什么时候不使用AOT编译,但是动态生成字节码?


8058
2018-02-23 08:14


起源



答案:


好吧,我认为无论是从磁盘还是从内存加载类都无关紧要,这与PermGen空间有关。

但是,请注意问题可能没有您想象的那么糟糕:每个函数都编译一次。特别是,你可以在这里或那里看到的“动态”生成的匿名函数只编译一次,每次调用它们只会导致新的创建 实例 这些类(需要一个实例来存储词汇上下文)。

因此,以下代码导致创建两个类(一个用于create-fn,一个用于lambda-fn),无论create-fn的调用次数是多少?

(defn create-fn [n] (fn lambda-fn [x] (add n x)))


11
2018-02-23 09:14



并且,在REPL中,类可以被GC,因为每个REPL交互都会创建一个新的抛弃类加载器来加载newliy编译函数。 - cgrand


答案:


好吧,我认为无论是从磁盘还是从内存加载类都无关紧要,这与PermGen空间有关。

但是,请注意问题可能没有您想象的那么糟糕:每个函数都编译一次。特别是,你可以在这里或那里看到的“动态”生成的匿名函数只编译一次,每次调用它们只会导致新的创建 实例 这些类(需要一个实例来存储词汇上下文)。

因此,以下代码导致创建两个类(一个用于create-fn,一个用于lambda-fn),无论create-fn的调用次数是多少?

(defn create-fn [n] (fn lambda-fn [x] (add n x)))


11
2018-02-23 09:14



并且,在REPL中,类可以被GC,因为每个REPL交互都会创建一个新的抛弃类加载器来加载newliy编译函数。 - cgrand