Я новичок в Cojure, но я прочитал, что при использовании компиляции AOT для каждой функции создается класс. Разве это не означает много классов, которые потребляют пространство перм-ген? Нет ли проблем с этим? Как насчет того, когда компиляция AOT не используется, но байт-код генерируется "на лету"?
Разве Clojure не потребляет слишком много пространства perm-gen?
Ответ 1
Ну, я думаю, что неважно, загружен ли класс с диска или из памяти, в пространство PermGen.
Однако обратите внимание, что проблема может быть не такой плохой, как вы думаете: каждая функция компилируется один раз. В частности, анонимные функции, которые вы видите здесь или там, генерируемые "на лету", компилируются только один раз, и каждый их вызов просто приводит к созданию новых экземпляров этих классов (экземпляр необходим для хранения лексического контекста).
Таким образом, следующий код приводит к созданию двух классов (один для create-fn, один для lambda-fn), независимо от количества вызовов create-fn во время выполнения:
(defn create-fn [n] (fn lambda-fn [x] (add n x)))