JVM内存开销是线性扩展还是不变?

时间:2014-01-29 04:55:01

标签: java scala clojure jvm

根据我的经验,使用大约10兆字节驻留内存的C程序在翻译成Java时可能会使用大约40到50 MB,而在Clojure或Scala中可能会使用大约100 MB。我的问题是这个JVM内存开销是否线性扩展;如果C版本使用1千兆字节,Java版本是否需要4 GB?或者JVM内存开销是否是一个常数因素,这样1 GB C程序在Java中可能只使用1.5 GB?

我知道我可以对此进行基准测试,但我认为听到人们在生产中使用JVM内存的经验会比人工基准更具信息性,根据设计方式的不同,可能会偏向任何结果。< / p>

1 个答案:

答案 0 :(得分:4)

开销大约是10MB + 4xC内存。

10MB是没有任何东西的JVM。 Java 7 64位版本使用了这么多。

4x内存显然是一种“猜测”,因为它取决于您使用的数据类型。如果你在java中使用100%引用,它们占用的内存大约是4倍。 int和Integer之间存在相同的差异。

如果您的C代码中有很多malloc / new,那么Java中也会有这样的内容,并且Java的GC可能无法运行,因此还存在“尚未清理的死引用”的开销这在很大程度上取决于您无法控制的事情(GC时间)。