Насколько хорошо выполняется Clojure, когда дело доходит до объема памяти?
Что касается фона, я пишу веб-службу в Clojure (используя Compojure в этом случае).
Я не беспокоюсь о производительности, которая, кажется, достаточно хороша, и я всегда могу запустить больше серверных экземпляров.
Даже если реализация Clojure будет в 2-10 раз медленнее, чем соответствующая реализация Java, я всегда предпочел бы более чистый код перед необработанной производительностью.
Конечно, это зависит от того, что вы делаете, но я хотел бы знать, есть ли у вас какие-либо реальные события, когда дело доходит до объема памяти любого типа долгосрочных серверных решений в Java vs Clojure?
Ответы
Ответ 1
У меня был активный веб-сервер, основанный на Compojure, работающий более четырех месяцев без единой заминки (т.е. никаких OutOfMemoryExceptions или чего-то подобного...). Таким образом, Clojure кажется довольно надежным в длинных серверных приложениях.
Веб-сервер работает на Amazon EC2 с ок. 230 мБ памяти.
Верно, что Clojure относительно голоден в памяти - в дополнение к обычным накладным расходам JVM он делает много вещей, таких как динамическое поколение классов в фоновом режиме, которые поглощают память. Он также генерирует много временных объектов (например, создание объектов последовательности) и полагается на GC для очистки вещей.
Это действительно дизайнерское решение в Clojure - поскольку память дешевая и современная сборка мусора работает очень хорошо, Clojure имеет тенденцию выделять память довольно либерально, чтобы максимизировать гибкость и производительность.
Ответ 2
Еще одна проблема - простой недостаток дизайна в JVM: он использует UTF-16 в качестве внутренней строковой кодировки, поэтому в американско-ориентированном наборе данных все строки занимают вдвое больше памяти, чем должны.