问题 Clojure在内存占用方面的表现如何?


至于后台,我正在Clojure中编写一个Web服务(在本例中使用Compojure)。 我并不担心性能,这似乎足够好,我总是可以解决更多的服务器实例。

即使Clojure实现比相应的Java实现慢2-10倍,我也总是喜欢在原始性能之前使用更干净的代码。

当然,这取决于你在做什么,但我想知道你在Java和Clojure的任何类型的长期服务器解决方案的内存占用情况下是否有任何实际体验?


4831
2017-10-30 11:14


起源



答案:


我有一个活跃的基于Compojure的Web服务器运行超过四个月没有一个故障(即没有OutOfMemoryExceptions或类似的......)。所以Clojure在长期运行的服务器应用程序中似乎非常强大。

Web服务器在Amazon EC2上运行,大约为。 230mb内存占用。

确实,Clojure是相对内存饥渴的 - 除了通常的JVM开销之外,它还会做很多事情,例如在后台运行动态类生成会占用内存。它还会生成许多临时对象(例如序列对象的构造),并依赖于GC来清除事物。

这实际上是Clojure中的一个设计决策 - 由于内存很便宜且现代垃圾收集性能很好,Clojure倾向于相当自由地分配内存以最大限度地提高灵活性和性能。


13
2017-10-30 12:38



实际上,一代人可以吃掉记忆。对于一个长期运行和/或繁重的过程,我发现了解java内存类型和垃圾收集以及学习调整JVM参数是值得的。 - G__


答案:


我有一个活跃的基于Compojure的Web服务器运行超过四个月没有一个故障(即没有OutOfMemoryExceptions或类似的......)。所以Clojure在长期运行的服务器应用程序中似乎非常强大。

Web服务器在Amazon EC2上运行,大约为。 230mb内存占用。

确实,Clojure是相对内存饥渴的 - 除了通常的JVM开销之外,它还会做很多事情,例如在后台运行动态类生成会占用内存。它还会生成许多临时对象(例如序列对象的构造),并依赖于GC来清除事物。

这实际上是Clojure中的一个设计决策 - 由于内存很便宜且现代垃圾收集性能很好,Clojure倾向于相当自由地分配内存以最大限度地提高灵活性和性能。


13
2017-10-30 12:38



实际上,一代人可以吃掉记忆。对于一个长期运行和/或繁重的过程,我发现了解java内存类型和垃圾收集以及学习调整JVM参数是值得的。 - G__


另一个问题是JVM中的一个简单设计缺陷:它使用UTF-16作为其内部字符串编码,因此在以美国为中心的数据集中,所有字符串都占用了应有的内存的两倍。


2
2017-10-31 14:14



是的,虽然如果UTF-16字符导致你内存不足,现在你明显有很多主要的设计问题:-) - mikera