Насколько хорошо выполняется 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 в качестве внутренней строковой кодировки, поэтому в американско-ориентированном наборе данных все строки занимают вдвое больше памяти, чем должны.