2010-10-30 13 views
11

Was den Hintergrund betrifft, schreibe ich einen Webservice in Clojure (mit Compojure i in diesem Fall). Ich mache mir keine Sorgen über die Leistung, das scheint gut genug zu sein und ich kann immer mehr Server-Instanzen feuern.Wie gut funktioniert Clojure, wenn es um den Speicherbedarf geht?

Auch wenn eine Clojure-Implementierung 2-10 mal langsamer als die entsprechende Java-Implementierung wäre, würde ich immer einen saubereren Code vor roher Leistung bevorzugen.

Natürlich hängt es davon ab, was Sie tun, aber ich würde gerne wissen, wenn Sie irgendwelche realen Erfahrungen haben, wenn es um den Speicherbedarf von jeder Art von langlebigen Server-Lösungen in Java vs Clojure kommt?

Antwort

14

Ich hatte einen aktiven Compojure-basierten Web-Server, der über vier Monate ohne eine einzige Störung läuft (d. H. Keine OutOfMemoryExceptions oder ähnliches ....). So scheint Clojure in lang laufenden Serveranwendungen ziemlich robust zu sein.

Der Webserver läuft auf Amazon EC2 mit einem ca. 230 MB Speicherbedarf.

Es ist wahr, dass Clojure relativ speicherhungrig ist - neben dem üblichen JVM Overhead macht es viele Dinge wie dynamische Klassengenerierung im Hintergrund, die Speicher auffressen. Es erzeugt auch eine Menge temporärer Objekte (z. B. die Konstruktion von Sequenzobjekten) und verlässt sich auf den GC, um Dinge zu klären.

Dies ist eigentlich eine Design-Entscheidung in Clojure - da Speicher billig ist und moderne Speicherbereinigung sehr gut funktioniert, neigt Clojure dazu, Speicher großzügig zu verteilen, um Flexibilität und Leistung zu maximieren.

+2

In der Tat kann die Klassengeneration Speicher auffressen. Für einen langwierigen und/oder schweren Prozess habe ich herausgefunden, dass es sich lohnt, etwas über Java-Speichertypen und Garbage Collection zu lernen und zu lernen, JVM-Parameter zu optimieren. – Greg

2

Ein weiteres Problem ist ein einfacher Konstruktionsfehler in der JVM: Es verwendet UTF-16 als interne String-Codierung, so dass in einem amerikanisch-zentrischen Datensatz alle Strings doppelt so viel Speicher benötigen wie sie sollten.

+3

true, aber wenn UTF-16-Zeichen dazu führen, dass dir heutzutage zu wenig Speicher zur Verfügung steht, hast du ganz klar ziemlich große Designprobleme :-) – mikera

Verwandte Themen