Разве Clojure не занимает слишком много места для перманентного поколения? - PullRequest
11 голосов
/ 23 февраля 2011

Я новичок в Cojure, но я читал, что при использовании компиляции AOT класс создается для каждой функции.Разве это не означало бы много классов, которые занимают пространство перманского поколения?Нет ли проблем с этим?Что делать, когда компиляция AOT не используется, но байт-код генерируется на лету?

1 Ответ

11 голосов
/ 23 февраля 2011

Ну, я думаю, что это не имеет значения, если класс загружается с диска или из памяти, за исключением пространства PermGen.

Однако обратите внимание, что проблема может быть не такой серьезной, как вы думаете: каждая функция компилируется один раз. В частности, анонимные функции, которые вы можете увидеть здесь или там, сгенерированные «на лету», компилируются только один раз, и каждый их вызов просто приводит к созданию новых экземпляров этих классов (требуется экземпляр хранить лексический контекст).

Таким образом, следующий код приводит к созданию двух классов (один для create-fn, другой для lambda-fn), независимо от того, какое количество вызовов create-fn будет во время выполнения:

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

...