至于背景,我正在Clojure中编写一个Web服务(在这种情况下使用Compojure)。 我并不担心性能,这似乎足够好,而且我总是可以解决更多的服务器实例。
即使Clojure实现比相应的Java实现慢2-10倍,我也总是喜欢在原始性能之前使用更干净的代码。
当然,这取决于你在做什么,但我想知道你在Java和Clojure中使用任何类型的长期服务器解决方案的内存占用时是否有任何实际体验?
答案 0 :(得分:13)
我有一个活跃的基于Compojure的Web服务器,运行时间超过四个月没有任何故障(即没有OutOfMemoryExceptions或类似的......)。所以Clojure在长期运行的服务器应用程序中似乎非常强大。
Web服务器在Amazon EC2上运行,大约有。 230mb内存占用。
Clojure确实比较需要内存 - 除了通常的JVM开销之外,它还会做很多事情,例如在后台运行动态类,会占用内存。它还会生成许多临时对象(例如序列对象的构造),并依赖GC来清理它。
这实际上是Clojure中的一个设计决策 - 由于内存很便宜且现代垃圾收集性能很好,Clojure倾向于相当自由地分配内存以最大限度地提高灵活性和性能。
答案 1 :(得分:2)
另一个问题是JVM中的一个简单的设计缺陷:它使用UTF-16作为其内部字符串编码,因此在以美国为中心的数据集中,所有字符串都占用了应有的内存的两倍。